Java泛型超级关键字

但是,我似乎仍然对super关键字感到迷茫:

当我们声明这样的集合时:

List<? super Number> list = null;

list.add(new Integer(0));//this compiles

list.add(new Object());//this doesn't compile

不应该相反吗?我们有一个列表,其中包含一些对象(类型未知),它们是的父对象Number。因此Object应该适合(因为它是的父项Number),Integer而不应该。由于某种原因,情况恰恰相反。

只要我们有以下代码

static void test(List<? super Number> param) {

param.add(new Integer(2));

}

public static void main(String[] args) {

ArrayList<String> sList = new ArrayList<String>();

test(sList); //will never compile, however...

}

编译上面的代码是不可能的(我的理智建议这是正确的行为),但是基本逻辑可以证明是相反的:

String is Object, Object is superclass of Number. So String should work.

我知道这很疯狂,但这不是他们不允许使用<S super T>结构的原因吗?如果是,那为什么<? super T>允许?

有人可以帮助我恢复此逻辑链的缺失部分吗?

回答:

中的有界通配符List<? super Number>可以捕获Number及其任何超类型。由于Number extends Object implements Serializable,这意味着当前唯一可被捕获转换的类型List<? super Number>是: