Java 为什么我们可以';t do List<;家长>;mylist=ArrayList<;儿童>;();

Java 为什么我们可以';t do List<;家长>;mylist=ArrayList<;儿童>;();,java,generics,inheritance,collections,Java,Generics,Inheritance,Collections,为什么我们做不到 List<Parent> mylist = ArrayList<child>(); List mylist=ArrayList(); 假设我们可以。那么这个程序必须是好的: ArrayList<Banana> bananas = new ArrayList<Banana>(); List<Fruit> fruit = bananas; fruit.add(new Apple()); Banana banana =

为什么我们做不到

List<Parent> mylist = ArrayList<child>();
List mylist=ArrayList();

假设我们可以。那么这个程序必须是好的:

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

Banana banana = bananas.get(0);
但它不知道这是一个什么样的水果清单,并确保你不能做错事


请参阅另一种解释。

,因为它们不是同一类型。假设您有另一个子类
Parent
Child2
,以便进行论证),则可以将
Child2
的实例放入
列表
,但键入不正确则将其放入
列表
的实例中。协变继承是一个真正令人头痛的问题,Java中只支持数组类型的协变继承(在这种情况下,它可能会导致奇怪的问题)。

应该是这样,因为我们可以: 父级A=新的子级()

编辑:等等,实际上是这样的:


列表=新的ArrayList();
List tmp=new ArrayList();
list.addAll(tmp);
List tmp2=newarraylist();
list.addAll(tmp2);


只是不支持直接演员阵容。

我非常喜欢这个解释。乔恩,你刚刚把我关于AlignmentAssigner的问题与此联系起来;我实现了extends表示法,它很有效。一个问题:当我将填充数组传递给扩展接口的实用程序方法时,该列表的类型更改为泛型。有没有可能让一个方法扩展一个接口,处理实现该接口的数据,然后将其作为原始类型传递回去?我唯一的问题是,我必须使用我的实现类来强制转换新的泛型列表。@rainydaymatt:如果不将类型本身设置为泛型,则不能。否则,您将如何保存有关您拥有的列表类型的信息?这可能是您引用的常见问题解答:@Jake88:谢谢,挑剔:当讨论继承时,
父项
/
子项
隐喻很奇怪,因为继承描述的是一种关系。(您认为
子级
父级
?)因为家谱或层次结构经常被用作Java类型层次结构的类比。虽然从语义上讲你有道理。
List<? extends Fruit> fruit = new ArrayList<Banana>();
Fruit firstFruit = fruit.get(0);