我如何将`MyClass`添加到`List <?扩展MyClass>`

don*_*nea 4 java generics inheritance extends

我有一个Java类,其中包含扩展MyClass的Objects子项.

class MyClass {
List<? extends MyClass> items;
[...]
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法将MyClass项插入此列表.我不明白为什么,以及如何绕过这个问题.例如:

void foo(){
  items = new LinkedList<MyClass>(); // This is OK
  items.add(new MyClass()); // Not allowed... why?
}
Run Code Online (Sandbox Code Playgroud)

编译器说" 类型List中的方法add(capture#1-of?extends MyClass)不适用于参数(MyClass)"

我真的不明白如何绕过这个问题,以及为什么编译器应该只接受一个必须扩展MyClass的类型.

注意:为什么我需要使用这种方法?因为我需要允许MyClass的扩展包含子项列表.

孙兴斌*_*孙兴斌 6

List<? extends MyClass> items表示类型参数是可分配的未知类型MyClass.

例如,它可能是一个ListMySubClass:

public MySubClass extends MyClass{}

List<? extends MyClass> items = new ArrayList<MySubClass>();
Run Code Online (Sandbox Code Playgroud)

现在考虑你也MyAnotherSubClass从哪个延伸MyClass:

public MyAnotherSubClass extends MyClass{}

MyClass item = new MyAnotherSubClass(); // refer it using MyClass
Run Code Online (Sandbox Code Playgroud)

显然,List<MySubClass> 不应该被允许包含MyAnotherSubClass:

items.add(item); // compile error
Run Code Online (Sandbox Code Playgroud)