什么类型返回get方法?

时间:2015-06-25 09:22:19

标签: java list generics

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

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#2MyClass的子类型,但MyClass不是CAP#1的子类型1}}?

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

public class MySubClass extends MyClass{ }

CAP#2MySubClass的子类型吗?

2 个答案:

答案 0 :(得分:5)

即使你知道

class MySubClass extends MyClass{ }

编译器并不完全确定您要添加的对象符合 MyClass 未知子类型的限制,因为没有任何保证< em>“unknown”可以是MySubClass。因此,它会引发错误。

这是well-known as PECS

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

List<? extends MyClass> nms = new ArrayList<MyClass>();

您将无法添加任何 null引用,因为它是唯一符合“unknown”的

答案 1 :(得分:4)

不,<? extends MyClass>是一个未知类,可以扩展MyClass(可以是MyClass本身)。无法保证与MySubClass有任何关系。

MyClass替换为Number,将MySubClass替换为BigDecimal。然后你有<? extends Number>。那可能是LongLongBigDecimal无关(即使两者都延伸Number)。

对于这两种方法,get将返回MyClass的内容。 add只会接受未知类型的实例(并且由于编译器无法对未知类型强制执行,因此除了null之外,它不会允许您添加任何内容。)