【发布时间】:2015-05-15 12:50:11
【问题描述】:
public static void main(String... args) {
List<Child> list1 = new ArrayList<Child>();
method2(list1);
}
public static void method2(List<Parent> list1) {
}
我得到以下编译错误
方法method2(List)未定义...
上述问题可以通过将List<Parent> list1修改为List<? extends Parent> list1来解决。
但是如果我尝试像下面这样添加子对象
public static void method2(List<? extends Parent> list1) {
Child child1 = new Child();
list1.add(child1);
}
它再次给出编译错误
类型List中的add(capture#1-of ? extends Parent)方法不适用于参数(Child)
所以我的问题是如果List<Child> 可以作为参数传递给List<? extends Parent> list1 为什么我们不能在List<? extends Parent> 下添加子对象?
【问题讨论】:
-
请张贴子类和父类的定义
-
查看 PECS 规则。你可以上课
Child2 extends Parent。如果允许,您可以将Child实例添加到List<Child2>。 -
作为一个不相关的注释,我每次看到
class Child extends Parent {}都会开始抽搐。孩子不应该是父母!!! LSV。Parent parent = new Child();是一个无意义的继承类比。 -
那是因为您从生物学角度考虑 Child 和 Parent,而不是阶级关系。他从未提到 Child 扩展 Parent 并且每个人都理解这个问题的事实说明了这一点。
-
@DanielL。事实上,我经常看到父母/孩子专门被用作生物学类比(参见例如我在 Google 第一页找到的 this tutorial)。此外,如果 OP 使用
class Gidget extends Gadget {},我们就会理解这个问题。可能是任何东西。无论如何,我并不是在批评这个问题。