为什么我们不能做
List<Parent> mylist = ArrayList<child>();
答案 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)
因为它们不是同一类型。假设您有另一个子类Parent
(Child2
为了参数),那么就可以将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);
只是不支持直播。