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?
即使你知道这一点
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参考,因为它是与唯一兼容的"未知"