Ism*_*ush 62 java generics collections inheritance
为什么我们做不到
List<Parent> mylist = ArrayList<child>();
Run Code Online (Sandbox Code Playgroud)
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泛型常见问题解答另一种解释.
因为它们不是同一类型.假设你有另一个子类Parent(Child2为了参数),那么就可以将一个实例Child2放入a List<Parent>,但是类型不正确将它放入一个实例中List<Child>.协变继承是一个真正令人头痛的问题,并且只在Java中支持数组类型(它可能导致奇怪的问题).
| 归档时间: |
|
| 查看次数: |
20904 次 |
| 最近记录: |