名单<?扩展MyType>

Lan*_*lot 39 java generics list bounded-wildcard

我有关于泛型的Java问题.我宣布了一个通用名单:

List<? extends MyType> listOfMyType;
Run Code Online (Sandbox Code Playgroud)

然后在某些方法中我尝试实例化并将项添加到该列表:

listOfMyType = new ArrayList<MyType>();
listOfMyType.add(myTypeInstance); 
Run Code Online (Sandbox Code Playgroud)

哪里myTypeInstance只是一个类型的对象MyType; 它不会编译.它说:

该方法在类型List <capture#3-of中添加(捕获#3-of?extends MyType)?extends MyType>不适用于参数(MyType)

任何的想法?

Sur*_*rya 32

你不能用扩展"put"做.看看泛型 - 获取和放置规则.

  • 正如Josh Bloch所说:"记住PECS:制片人扩展,消费者超级." 由于listOfMyType是一个使用者(你正在添加它),`super`是有效的,而`extends`则不是. (9认同)

Tom*_*ine 26

考虑:

class MySubType extends MyType {
}

List<MySubType> subtypeList = new ArrayList<MySubType>();
List<? extends MyType> list = subtypeList;
list.add(new MyType());
MySubType sub = subtypeList.get(0);
Run Code Online (Sandbox Code Playgroud)

sub现在包含一个MyType非常错误的.


Cam*_*ope 6

您无需在情况下使用通配符捕获语法,只需声明

List<MyType> listOfMytype;
Run Code Online (Sandbox Code Playgroud)

应该足够了。如果您想确切地知道为什么,那么Java Generics教程比您想了解的更多有关Java Generics的深奥疯狂。第20页解决您的具体情况。

至于为什么不能使用通配符捕获进行添加的原因,是因为编译器无法精确确定列表在每种情况下都属于MyType的哪个子类,因此编译器会发出错误消息。