Jon*_*eet 122

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

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

Banana banana = bananas.get(0);
Run Code Online (Sandbox Code Playgroud)

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

可以做的是:

List<? extends Fruit> fruit = new ArrayList<Banana>();
Run Code Online (Sandbox Code Playgroud)

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

Fruit firstFruit = fruit.get(0);
Run Code Online (Sandbox Code Playgroud)

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

请参阅Java泛型常见问题解答另一种解释.

  • 我很喜欢这个解释. (3认同)

Don*_*ows 5

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