名单<?super B> lsb = new ArrayList <A>(); java中的逻辑错误?

wza*_*ski 3 java generics list wildcard arraylist

我们有:

class A{}
class B extends A{}
class C extends B{}
class D extends C{}
Run Code Online (Sandbox Code Playgroud)

我们可以定义列表,如:

List<? super B> lsb1 = new ArrayList<Object>();
//List<? super B> lsb2 = new ArrayList<Integer>();//Integer, we expect this    
List<? super B> lsb3 = new ArrayList<A>();
List<? super B> lsb4 = new ArrayList<B>();
//List<? super B> lsb5 = new ArrayList<C>();//not compile
//List<? super B> lsb6 = new ArrayList<D>();//not compile
Run Code Online (Sandbox Code Playgroud)

现在我们创建一些对象:

Object o = new Object();
Integer i = new Integer(3);
A a = new A();
B b = new B();
C c = new C();
D d = new D();
Run Code Online (Sandbox Code Playgroud)

我将尝试将此对象添加到List:

List<? super B> lsb = new ArrayList<A>();
lsb.add(o);//not compile
lsb.add(i);//not compile 
lsb.add(a);//not compile
lsb.add(b);
lsb.add(c);
lsb.add(d);
Run Code Online (Sandbox Code Playgroud)

题:

为什么我定义引用时List<? super B>可以使用new ArrayList<>();哪个可以包含B,A,Object的元素类型(我期望这个),但是当我向这个列表中添加元素时,我只能添加类型为B,C,D的对象吗?