Java 如何列出<;对象>;是列表的子类型<;?超级数字>;
在阅读《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类型
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@PrateekList
在技术上不是List@zakinster.不。列表
绝对是列表的一个子类型,但在解释时,它说列表是一个子类型好的,这就是我需要的…谢谢上帝,但是这种持续性是如何被证明的,你能解释一下吗不知道你在问什么。这只是一个逆变泛型类型的定义。我的意思是,编译器如何理解这种行为?
Collections.<Number>copy(objs, ints);