我目前正在阅读 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。
但这怎么可能呢?
如果取为Integer,这意味着在方法声明中-
List<? extends T>
将转换为 List<Integer extends Integer>
.
这是一个错误,还是关于泛型有不同的规则?我四处搜索,大多数结果都说一个类不能是其自身的子类。
最佳答案
不,这不是错误。
? extends Integer
表示:任何是或扩展 Integer 的类(或实现 Integer,如果 Integer 是一个接口(interface))。
也一样吗? super Integer
,这意味着:任何 Integer 类或者是 Integer 的父类(super class)或超接口(interface)。
关于Java Generics - 类本身的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441733/