为什么JVM不允许这个编译?

时间:2015-05-27 13:55:21

标签: java

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无法编译(动物:动物)???这在逻辑上是否正确?

2 个答案:

答案 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