public class CollectionTestImpl {
public static void main(String[] args){
List<Animal> ld1 = new ArrayList<Animal>();
ld1.add(new Dog());
ld1.add(new Cat());
impl.addAnimals(ld1 );
}
public void addAnimals(List<? super Dog> animals){
for (Animal animal : animals){ // this is not allowed compile error
System.out.println(animal.checkUp());
}
}
}
为什么JVM无法编译(动物:动物)???这在逻辑上是否正确?
答案 0 :(得分:4)
List<? super Dog> animals
是一个列表,可以引用List<Dog>
List<Animal>
,也可以引用List<Object>
,因为所有Dog
Animal
和{{1}可以视为Object
的超类型。
因为Dog
可能animals
List<Object>
无法工作,因为并非所有对象都必须是动物。
答案 1 :(得分:3)
考虑一下List
addAnimals()
方法的List
种类型。您的泛型表明它是Dog
的某些超类型的List
。所以它可能是Object
的{{1}}!
显然,由于它可能是List<Object>
,因此编译器无法保证列表中的所有内容都是Animal
。