在阅读书籍《Java Generics and Collections》时,在使用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`,它是`List`的子类型(由于`Object`是通配符所需的超类型`Number`),而`ints`的类型是`List`,它是`List`的子类型(由于`Integer`是通配符所需的子类型`Number`)。
我的疑问是:`List`如何成为`List`的子类型?
Object
肯定满足? super Number
中的通配符,不是吗? - Jon SkeetObject
满足通配符的要求,因此该调用是有效的。(也许它确实在技术上是一个子类型;我只需要非常仔细地检查一下。) - Jon Skeet