这个声明:
List<?> getOuterList() { }
告诉编译器“我不知道会得到什么样的列表”。然后你基本上执行。
list<dunno-what-this-is>.add((MyObject)myObject)
它无法将MyObject添加到不知道其类型的某些内容的列表中。
这个声明:
protected List<? extends Object> getOuterList() { ... }
告诉编译器,“这是一系列Object的子类型”。因此,当然不能将“MyObject”强制转换为对象列表。因为编译器只知道该列表可以包含对象。但是,您可以执行以下操作:
List<? super MyObject>.getOuterList() { ... }
然后成功添加了一个MyObject。这是因为现在编译器知道List是MyObject的列表,或者任何MyObject的父类型,所以它肯定可以接受MyObject。
编辑:至于你的DogKennel示例,我认为这段代码片段可以实现你想要的功能:
protected List<GreyHound> greyHounds;
public List<GreyHound> getGreyHounds() {
return this.greyHounds;
}
public List<? extends Dog> getDogs() {
return getGreyHounds();
}