为什么我们不能做List<Parent> mylist = ArrayList<child>();
2022-08-31 14:30:11
为什么我们不能做
List<Parent> mylist = ArrayList<child>();
为什么我们不能做
List<Parent> mylist = ArrayList<child>();
假设我们可以。那么这个程序必须没问题:
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 泛型常见问题解答的另一个说明。
因为它们不是同一类型。假设您有另一个子类 (为了参数起见),则可以将 的实例放入 ,但类型不正确地将其放入 的实例中。协变继承是一个非常令人头疼的问题,并且仅在Java中支持数组类型(它可能导致奇怪的问题)。Parent
Child2
Child2
List<Parent>
List<Child>