泛型 - 为什么可以将 T 的子级添加到 List<?超级T>

mic*_*wth 1 java generics collections

摘自/sf/answers/1346223371/

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)

Stu*_*rks 7

我认为这个问题具体是关于 的含义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)有效。