如果类型变量是通配符,那么该方法的返回类型是什么?
public class MyClass{ }
List<? extends MyClass> nms = new ArrayList<MyClass>();
nms.add(new MyClass()); //compilation error
MyClass n = nms.get(0); //compiles fine
事情是get
的返回类型不是纯MyClass
类型。 Eclipse告诉我它是CAP#2
,而add方法的参数是CAP#1
,其中CAP#2
是MyClass
的子类型,但MyClass
不是CAP#1
的子类型1}}?
所以,我对编译器捕获的类型在类层次结构中的位置感兴趣?如果我们创建
public class MySubClass extends MyClass{ }
CAP#2
是MySubClass
的子类型吗?
答案 0 :(得分:5)
即使你知道
class MySubClass extends MyClass{ }
编译器并不完全确定您要添加的对象符合 MyClass 未知子类型的限制,因为没有任何保证< em>“unknown”可以是MySubClass
。因此,它会引发错误。
因此,将您的列表定义为:
List<? extends MyClass> nms = new ArrayList<MyClass>();
您将无法添加任何但 null
引用,因为它是唯一符合“unknown”的
答案 1 :(得分:4)
不,<? extends MyClass>
是一个未知类,可以扩展MyClass
(可以是MyClass
本身)。无法保证与MySubClass
有任何关系。
将MyClass
替换为Number
,将MySubClass
替换为BigDecimal
。然后你有<? extends Number>
。那可能是Long
。 Long
与BigDecimal
无关(即使两者都延伸Number
)。
对于这两种方法,get
将返回MyClass
的内容。 add
只会接受未知类型的实例(并且由于编译器无法对未知类型强制执行,因此除了null
之外,它不会允许您添加任何内容。)