什么类型返回get方法?

use*_*882 3 java generics list

如果类型变量是通配符,那么该方法的返回类型是什么?

public class MyClass{ }

List<? extends MyClass> nms = new ArrayList<MyClass>();
nms.add(new MyClass()); //compilation error
MyClass n = nms.get(0); //compiles fine
Run Code Online (Sandbox Code Playgroud)

东西是返回类型get不是纯MyClass类型.Eclipse告诉我它CAP#2和add方法的参数在CAP#1哪里CAP#2是subtypeof MyClass,但MyClass不是subtypeof CAP#1

所以,我对编译器捕获类型在类层次结构中的位置感兴趣?如果我们创造

public class MySubClass extends MyClass{ }
Run Code Online (Sandbox Code Playgroud)

CAP#2是哪一个子类型MySubClass

Kon*_*kov 5

即使你知道这一点

class MySubClass extends MyClass{ }
Run Code Online (Sandbox Code Playgroud)

编译器并不完全确定要添加到列表中的对象是否符合MyClass未知子类型的限制,因为没有任何保证可以保证"未知"MySubClass.因此,它会引发错误.

这是众所周知的PECS.

因此,将您的列表定义为:

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

你将能够添加什么,但是null参考,因为它是与唯一兼容的"未知"

  • "一种只能从中读取的列表".例如,这对于不会不必要地限制其参数类型的方法签名非常有用. (2认同)