Java 泛型 - Class 其自身的子类?
Java Generics - Class a Subclass of itself?
我目前正在阅读 Java 泛型,当涉及到通配符时我有点卡住了。
我从 Collections class:
得到了这个方法
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>
。
这是一个错误,还是关于泛型有不同的规则?我用谷歌搜索了一下,大多数结果都说 class 不能是其自身的子 class。
不,这不是错误。
? extends Integer
表示:任何 class 是或扩展 Integer(或实现 Integer,如果 Integer 是一个接口)。
同样适用于 ? super Integer
,这意味着:任何 class 是 Integer 或者是 Integer 的 superclass 或 super-interface。
我目前正在阅读 Java 泛型,当涉及到通配符时我有点卡住了。
我从 Collections class:
得到了这个方法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>
。
这是一个错误,还是关于泛型有不同的规则?我用谷歌搜索了一下,大多数结果都说 class 不能是其自身的子 class。
不,这不是错误。
? extends Integer
表示:任何 class 是或扩展 Integer(或实现 Integer,如果 Integer 是一个接口)。
同样适用于 ? super Integer
,这意味着:任何 class 是 Integer 或者是 Integer 的 superclass 或 super-interface。