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());
都不被接受。
如果您希望能够同时添加 Dog
s 和 Cat
s,请使用类型为 List<Animal>
.
的变量
如果您希望只能添加 Dog
s,请使用 List<Dog>
.
类型的变量
您好,我在下面的代码中有一个查询。
当我声明动物列表时,它允许我将 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());
都不被接受。
如果您希望能够同时添加 Dog
s 和 Cat
s,请使用类型为 List<Animal>
.
如果您希望只能添加 Dog
s,请使用 List<Dog>
.