为什么我们不能做List <parent> mylist = ArrayList <child>(); </child> </parent>

时间:2011-04-23 10:53:17

标签: java generics inheritance collections

为什么我们不能做

List<Parent> mylist = ArrayList<child>();

3 个答案:

答案 0 :(得分:118)

假设我们可以。然后这个程序必须没问题:

ArrayList<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());

Banana banana = bananas.get(0);

这显然不是类型安全的 - 你最终在香蕉系列中加了一个苹果。

可以做的是:

List<? extends Fruit> fruit = new ArrayList<Banana>();

这是安全的,因为编译器不会让你尝试将添加添加到水果列表中。它知道它是某种水果的清单,所以你可以写:

Fruit firstFruit = fruit.get(0);

但它不知道它是什么类型的水果,并确保你不能做错事。

请参阅Java generics FAQ其他说明。

答案 1 :(得分:5)

因为它们不是同一类型。假设您有另一个子类ParentChild2为了参数),那么就可以将Child2的实例放入List<Parent>,但输入 - 将它放入List<Child>的实例中是不正确的。协变继承是一个真正令人头疼的问题,只有Java支持数组类型(它可能导致奇怪的问题)。

答案 2 :(得分:-3)

应该这样,因为我们可以这样做: 父A =新Child();

编辑:等等,实际上是有效的:

List<Parent> list = new ArrayList<Parent>(); List<ChildA> tmp = new ArrayList<ChildA>(); list.addAll(tmp); List<ChildB> tmp2 = new ArrayList<ChildB>(); list.addAll(tmp2);

只是不支持直播。