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>
是:
- List
- List
- List
请注意,你可以add(Integer.valueOf(0))
使用上述任何一种。但是,你不能 add(new Object())
使用List<Number>
或List<Serializable>
,因为这违反了通用类型安全规则。
因此,它是不是真的,你可以add
任意超Number
到List<? super Number>
; 根本不是有限的通配符和捕获转换如何工作。你不声明a
是List<? super Number>
因为你可能想向其中添加一个Object(你不能!);之所以这样做,是因为你要向其中添加Number对象(即,它是的“消费者” Number),而仅仅是a List<Number>
的限制太大。
以上是 Java泛型超级关键字 的全部内容, 来源链接: utcz.com/qa/410693.html