关于Java:为什么我们不能做List mylist = ArrayList ()

Why we can't do List<Parent> mylist = ArrayList<child>();

本问题已经有最佳答案,请猛点这里访问。

为什么我们做不到

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


假设我们可以。那么这个程序就必须是好的:

1
2
3
4
5
ArrayList<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());

Banana banana = bananas.get(0);

很明显,这不是一个安全的类型-你已经结束了一个苹果在收集香蕉。

你能做的是:

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

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

1
Fruit firstFruit = fruit.get(0);

但它不知道它是一份什么水果的清单,并且确保你不会做错事。

请参见Java泛型常见问题解答的另一个解释。


因为它们不是同一类型。假设您有另一个Parent的子类(Child2,出于论证的考虑),那么可以将Child2的一个实例放入List中,但类型不正确,无法将其放入List的实例中。协变继承是一个令人头疼的问题,在Java中只支持数组类型(因为它可能会导致奇怪的问题)。


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

编辑:等等,实际上它是工作的:


List list = new ArrayList();
List tmp = new ArrayList();
list.addAll(tmp);
List tmp2 = new ArrayList();
list.addAll(tmp2);

只是不支持直接强制转换。