使用超级关键字迭代通用列表

Abu*_*kar 0 java generics collections

我有以下2课:

class A {
    public String toString(){
        return "A Class";
    }
}

class B extends A {
    public String toString(){
        return "B Class";
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下代码,在将一些对象添加到列表后调用测试方法:

List<B> myList = new ArrayList<B>();
myList.add(new B());
myList.add(new B());

testList(myList);
Run Code Online (Sandbox Code Playgroud)

现在,我的testList方法是这样的:

public void testList(List<? super B> aList){        
        for(A myObject : aList){  //This is showing compiler error
            System.out.println(myObject);
        }  

       for(B myObject : aList){  //Even this is showing compiler error
            System.out.println(myObject);
        }

       for(Object myObject : aList){  //This works fine
            System.out.println(myObject);
        }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用参考类型AB迭代.

testListmehtod中的列表声明是super关键字.

Psh*_*emo 9

List<? super B> aList可以参照List<B>,List<A>List<Object>因此在

for(A myObject : aList)
Run Code Online (Sandbox Code Playgroud)

编译器不能让你使用A类型,因为它不能List<Object>正确处理,因为它也可以包含不是AB因为Object是所有类的超类的元素,String例如(并且使用A处理String将是错误的).

出于同样的原因你不能使用B(你将无法正确处理List<A>).Object这里只是安全的类型.