以下代码:
import java.util.*;
public final class JavaTest {
public static <T extends Comparable<? super T>> int max(List<? extends T> list, int begin, int end) {
return 5;
}
public static void main(String[] args) {
List<scruby<Integer>> List = new ArrayList<>();
JavaTest.<scruby>max(List, 0, 0); //how does this compile?, scruby doesn't meet
//T extends Comparable<? super T>
}
}
class scruby<T> implements Comparable<String>{
public int compareTo(String o) {
return 0;
}
}
语句JavaTest.max(List,0,0)如何编译?如何擦洗
T extends Comparable <? super T>
它实现了Comparable<String>
,它不是超级类型的擦洗?如果将其更改为scruby<Integer>
,则无法编译并提供错误。那为什么现在要编译呢?为什么raw类型编译?
答案 0 :(得分:3)
JavaTest.<scruby>max(List, 0, 0);
scruby
是原始类型。这抑制了一些类型检查。
您应该添加所有必需的类型参数:
JavaTest.<scruby<Integer>>max(List, 0, 0);
或者让Java推断它们:
JavaTest.max(List, 0, 0);