Java中泛型子类行为

Generics subclass behavior in java

嗨,我有下面代码中的查询。

当我声明动物列表时,它允许我将cat()和dog()放在其中,因为它们都是动物,满足是关系船。

1
2
3
4
5
6
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意味着接受动物的任何子类,那么为什么不编译下面的代码呢?

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

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

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

有人能解释这种行为吗?


类型为List的变量可以指定为ListListList。其中一些列表不允许添加Dog,而另一些则不允许添加Cat

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

如果要同时添加DogCat,请使用List类型的变量。

如果只想添加Dogs,请使用List类型的变量。