我目前正在阅读Java Generics,在通配符方面我有点陷入困境。
我从Collections类中获得了这个方法:
public void <T> copy(List<? super T> dest, List<? extends T> src) {
for(int i = 0; i < src.size(); i++) {
dest.set(i, src.get(i));
}
}
然后我被告知可以这样调用这个方法:
List<Object> objs = new ArrayList<Object>();
List<Integer> ints = new ArrayList<Integer>();
Collections.copy(objs, ints);
由于类型参数已留待编译器确定,本书称编译器选择类型参数为Integer。
但这怎么可能?
如果它被认为是整数,这意味着在方法声明中 -
List<? extends T>
会转换为List<Integer extends Integer>
。
这是一个错误,还是在使用泛型时有不同的规则?我已经google了,大多数结果都说一个类不能成为它自己的子类。
答案 0 :(得分:8)
不,这不是错误。
? extends Integer
表示:任何属于或扩展Integer的类(或实现Integer,如果Integer是接口)。
同样适用于? super Integer
,这意味着:任何类是Integer或者是Integer的超类或超级接口。