为什么我们不能做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);
但它不知道什么样的水果是一个列表,并确保你不能做错的事情。
查看Javagenerics常见问题的另一种解释。
因为它们不是同一types的 假设你有另一个Parent
类的子类(为了参数而使用Child2
),那么可以将一个Child2
的实例放入一个List<Parent>
,但是将其放入一个List<Child>
的实例中, 。 协变inheritance是一个真正令人头疼的问题,并且只有在Java中才支持数组types(在这种情况下会导致奇怪的问题)。
应该是这样的,因为我们可以这样做:Parent A = new Child();
编辑:等等,实际上它的工作原理:
List<Parent> list = new ArrayList<Parent>(); List<ChildA> tmp = new ArrayList<ChildA>(); list.addAll(tmp); List<ChildB> tmp2 = new ArrayList<ChildB>(); list.addAll(tmp2);
只是直接投射不被支持。