public class Test {
public static void main(String[] args) throws InterruptedException {
List<Collection> list1 = new ArrayList();
foo(list1);
bar(list1);
List<Set> list2 = new ArrayList<>();
foo(list2);
bar(list2);
List<HashSet> list3 = new ArrayList<>();
foo(list3);
bar(list3);
List<Object> list4 = new ArrayList<>();
foo(list4);
bar(list4);
List list5 = new ArrayList<>();
foo(list5);
bar(list5);
}
public static void foo(List<? super Set> list) {
}
public static void bar(List<? extends Set> list) {
}
}
类型层次:
Object
<-------Collection
<-------Set
<-------HashSet
从Java编译器的角度来看,那些行会报错?
留白
----------------------------------------------------------------------
留白
----------------------------------------------------------------------
List list5 = new ArrayList<>()
是最赖皮的。明明 List list5 = new ArrayList<>()
和 List<Object> list5 = new ArrayList<>()
是等价的,但是 javac 编译器就因为存在泛型标志 <type>
就加强了语法约束。