泛型在java中的子类行为

时间:2017-04-30 08:14:26

标签: java generics core

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

当我宣布动物名单时,它允许我将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表示接受任何动物的子类,那么为什么跟随代码不能编译。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您希望能够同时添加DogCat,请使用List<Animal>类型的变量。

如果您希望只能添加Dog,请使用List<Dog>类型的变量。