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);