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

2022-08-31 14:30:11

为什么我们不能做

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

答案 1

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

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 泛型常见问题解答的另一个说明。


答案 2

因为它们不是同一类型。假设您有另一个子类 (为了参数起见),则可以将 的实例放入 ,但类型不正确地将其放入 的实例中。协变继承是一个非常令人头疼的问题,并且仅在Java中支持数组类型(它可能导致奇怪的问题)。ParentChild2Child2List<Parent>List<Child>


推荐