java 中的泛型子类行为

Generics subclass behavior in java

您好,我在下面的代码中有一个查询。

当我声明动物列表时,它允许我将 Cat() 和 Dog() 放入其中,因为它们都是动物并且满足 IS A 关系。

Class Cat extends Animal{}
Class Dog extends Animal{}

List<Animal> list = new ArrayList<Animal>();
list.add(new Dog());//Code works fine
list.add(new Cat());//Code works fine

现在我的问题是,如果 ? extends 表示接受 Animal 的任何子类,那么为什么以下代码无法编译。

List<? extends Animal> list = new ArrayList<Animal>();
list.add(new Dog());//Compilation fails 
list.add(new Cat());//Compilation fails 

同样的问题,为什么这里不接受狗?

List<? extends Animal> dogs1 = new ArrayList<Dog>();
dogs1.add(new Dog());//Compilation fails

有人可以解释这种行为吗?

类型 List<? extends Animal> 的变量可以分配 List<Animal>List<Cat>List<Dog>。其中一些列表不允许添加 Dog,而另一些则不允许添加 Cat

编译器根据 list 变量的编译时类型验证 list.add 语句的正确性,而不是根据在运行时分配给它的实际对象。因此 list.add(new Dog());list.add(new Cat()); 都不被接受。

如果您希望能够同时添加 Dogs 和 Cats,请使用类型为 List<Animal>.

的变量

如果您希望只能添加 Dogs,请使用 List<Dog>.

类型的变量