为什么我们不能做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);

只是直接投射不被支持。