在泛型中使用extends关键字

时间:2015-10-03 16:35:30

标签: java generics

我正在尝试这个 -

List<? extends Integer> l = new ArrayList<Integer>();
l.add(10);

和编译器说 -

The method add(int, capture#1-of ? extends Integer) in the type List<capture#1-of ? extends Integer> is not applicable for the arguments (int)

为什么我无法将整数添加到整数列表中,为什么编译器在第一行本身没有抱怨如果我无法添加整数?

1 个答案:

答案 0 :(得分:8)

List<? extends Integer>表示扩展Integer的某些未知类型的列表。忘记Integerfinal的那一刻,在运行时它可能是某个子类型MyImaginaryInteger的列表,在这种情况下你不能添加Integer 10,因为那会破坏类型安全。这就是编译器不允许你添加元素的原因。

另一方面,List<? super Integer>表示某个未知类型的列表,该类型是Integer的父类。在这种情况下,添加Integer值10是正常的,因为无论该类型在运行时是什么类型,Integer都是它的子类型。

在您的具体情况下,根本没有这个通配符 - 只需将其声明为List<Integer>