阅读本书 Java Generics and Collections 。在 Wildcards with Super 一节中,我出现了一个例子
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
它被称为这样:
Collections.<Number>copy(objs, ints);
以上电话有效,其解释如下:
允许调用,因为
objs
的类型为List<Object>
,这是[{1}}的子类型(因为List<? super Number>
是Object
的超类型,因此需要通过通配符)和Number
的类型为ints
,这是[{1}}的子类型(因为List<Integer>
是List<? extends Number>
的子类型,因为扩展需要通配符)
我怀疑 Integer
Number
的子类型如何?
答案 0 :(得分:8)
这是子类型的定义。当且仅当X
类型的每个对象或基元也属于Y
类型时,类型X
类型为Y
类型的子类型。所以你问过的问题是List<Object>
类型的每个对象是否(或如何)也是List<? super Number>
类型。
现在,部分? super Number
表示“Number
的超类型的任何类型,包括Number
本身”。只有两种类型 - Number
和Object
。
所以List<? super Number>
是一个抽象类型,包含List<Number>
和List<Object>
,没有其他类型(当然,除了这两个类型的子类型)。
答案 1 :(得分:1)
? super
只是Java说“逆变”的奇怪方式。
首先围绕协方差展开:A<? extends B>
是A<? extends C>
的子类型iff B
是C
的子类型。因此List<? extends Number>
是List<? extends Object>
的子类型。
逆差异恰恰相反:A<? super B>
是A<? super C>
的子类型iff C
是B
的子类型。因此List<? super Object>
是List<? super Number>
的子类型。
答案 2 :(得分:0)
也许你正试图与描述作斗争。这样想:
List<? super Number>
表示它应该是一个存储任何对象的列表,只要该对象是Number的超类。所以List<Object>
显然符合标准。