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)
为什么我不能使用参考类型A或B迭代.
testListmehtod中的列表声明是super关键字.
List<? super B> aList可以参照List<B>,List<A>并List<Object>因此在
for(A myObject : aList)
Run Code Online (Sandbox Code Playgroud)
编译器不能让你使用A类型,因为它不能List<Object>正确处理,因为它也可以包含不是A或B因为Object是所有类的超类的元素,String例如(并且使用A处理String将是错误的).
出于同样的原因你不能使用B(你将无法正确处理List<A>).Object这里只是安全的类型.