mic*_*wth 1 java generics collections
public class Test {
public class A {}
public class B extends A {}
public class C extends B {}
public void testContraVariance(List<? super B> myBlist) {
B b = new B();
C c = new C();
myBlist.add(b);
myBlist.add(c);
A a = myBlist.get(0); // does not compile
}
}
Run Code Online (Sandbox Code Playgroud)
如果 myBlist 接受 B 的超类型,这意味着 B 或 up,那么为什么还可以像中那样向它添加一个子类型myBlist.add(c)?
我认为这个问题具体是关于 的含义List<? super B>。OP 写了“myBlist接受...... B 或向上”,我认为这是误解的根源。List<? super B>并不意味着列表只能包含 类型B或超类型的元素B。
相反,List<? super B>是一个列表,其类型参数是B或 的超类型B。考虑到问题中的类型层次结构以及此声明:
public void testContraVariance(List<? super B> myBlist)
Run Code Online (Sandbox Code Playgroud)
那么myBlist可以是 a List<B>、 aList<A>或 a List<Object>。这些类型中的任何一个都可以包含C. 这就是为什么myBlist.add(c)有效。