Java 如何列出<;对象>;是列表的子类型<;?超级数字>;

Java 如何列出<;对象>;是列表的子类型<;?超级数字>;,java,generics,collections,Java,Generics,Collections,在阅读《Java泛型和集合》一书时。在超级通配符一节中,我举了一个例子 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)); } } publicstaticvoidcopy(List这里是子类型的定义。X类型是Y类型

在阅读《Java泛型和集合》一书时。在超级通配符一节中,我举了一个例子

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));
  }
}

publicstaticvoidcopy(List这里是子类型的定义。
X
类型是
Y
类型的子类型,当且仅当
X
类型的每个对象或原语也是
Y
类型。因此,您要问的问题是是否(或如何)
List
类型的每个对象也属于
List类型,可能您正试图与描述抗争。请这样想:


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


首先将你的头绕在协方差上:
A@JonSkeet我不是在口译List@Prateek:我不会使用“子类型”这里是必要的,但是
对象
肯定满足了
?super Number
中的通配符,不是吗?@JonSkeet因为对象是?super Number的超类型。那么为什么列表是?super Number的子类型呢List@Prateek:同样,我可能不会在此上下文中使用subtype和supertype-至少在不仔细检查规范的情况下-但是我要说,
Object
满足通配符的要求,因此调用是有效的(从技术上讲,它可能确实是一个子类型;我只需要非常仔细地检查一下)好的。这意味着如果我传递了List而不是Object,那么它也将是一个有效的调用,因为它也满足了要求。明白了。谢谢…但是List不能是数字列表的子类型,所以只剩下List而已。@Prateek不是
数字
超级数字
的有效替代品吗?它是一个有效的替代品,但我感到困惑带有列表参数,称为的子类型List@Prateek
List
在技术上不是
List@zakinster.不。
列表
绝对是
列表的一个子类型,但在解释时,它说列表是一个子类型好的,这就是我需要的…谢谢上帝,但是这种持续性是如何被证明的,你能解释一下吗不知道你在问什么。这只是一个逆变泛型类型的定义。我的意思是,编译器如何理解这种行为?
Collections.<Number>copy(objs, ints);