在泛型中使用extends关键字

4

我正在尝试这个 -

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)

为什么我不能将整数添加到整数列表中?如果我无法添加整数,为什么编译器不会在第一行就报错呢?


3
List<? extends Integer> 不等同于 List<Integer>。请查看 PECS 了解更多信息。 - Codebender
@Codebender.. 正确。根据PECS原则,如果我用super替换extends,这个代码就可以工作了。但是为什么编译器在第一行没有报错呢? - Adil Shaikh
l.add(new Integer(10)) 应该可以工作,对吧?可能是自动装箱被关闭了。 - Kenney
@Kenney 不行,那样不会起作用。 - Adil Shaikh
@MohammadAdil,因为ArrayList<Integer>List<? extends Integer>的有效对象(子类型)。所以你的第一行是有效的... - Codebender
你唯一可以添加的是 null - Paul Boddington
1个回答

8
List<? extends Integer>表示一个未知类型的列表,该类型继承了Integer。暂且不考虑Integerfinal的事实,在运行时它可以是某个子类型MyImaginaryInteger的列表,因此您无法添加Integer 10,否则会破坏类型安全性。这就是为什么编译器不允许您添加元素的原因。

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

在您的具体情况中,没有必要使用通配符-只需将其声明为List<Integer>即可。


那么,在这种情况下,我能否将 MyImaginaryInteger 添加到 List<? extends Integer> 中呢? - Adil Shaikh
3
不行,因为它可能是一个 List<MyOtherImaginaryInteger> - Paul Boddington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接