List <object>如何是List <! - 的子类型?超级号码 - > </object>

时间:2014-01-25 08:37:15

标签: java generics collections

阅读本书 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 的子类型如何?

3 个答案:

答案 0 :(得分:8)

这是子类型的定义。当且仅当X类型的每个对象或基元也属于Y类型时,类型X类型为Y类型的子类型。所以你问过的问题是List<Object>类型的每个对象是否(或如何)也是List<? super Number>类型。

现在,部分? super Number表示“Number的超类型的任何类型,包括Number本身”。只有两种类型 - NumberObject

所以List<? super Number>是一个抽象类型,包含List<Number>List<Object>,没有其他类型(当然,除了这两个类型的子类型)。

答案 1 :(得分:1)

? super只是Java说“逆变”的奇怪方式。

首先围绕协方差展开:A<? extends B>A<? extends C>的子类型iff BC的子类型。因此List<? extends Number>List<? extends Object>的子类型。

逆差异恰恰相反:A<? super B>A<? super C>的子类型iff CB的子类型。因此List<? super Object>List<? super Number>的子类型。

答案 2 :(得分:0)

也许你正试图与描述作斗争。这样想:

List<? super Number>表示它应该是一个存储任何对象的列表,只要该对象是Number的超类。所以List<Object>显然符合标准。