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