嗨我在下面的代码中有一个查询 .
当我宣布动物名单时,它允许我将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 回答
可以为
List<? extends Animal>
类型的变量分配List<Animal>
,List<Cat>
或List<Dog>
. 其中一些列表不允许添加Dog
,而其他列表不允许Cat
.编译器根据
list
变量的编译时类型验证list.add
语句的正确性,而不是基于运行时分配给它的实际对象 . 因此,不接受list.add(new Dog());
和list.add(new Cat());
.如果您希望能够同时添加
Dog
和Cat
,请使用List<Animal>
类型的变量 .如果您希望只能添加
Dog
,请使用List<Dog>
类型的变量 .