【发布时间】:2016-03-30 05:54:06
【问题描述】:
我目前正在阅读 Java 泛型,但在通配符方面我有点卡住了。
我从 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>。
这是一个错误,还是在关于泛型时有不同的规则?我用谷歌搜索,大多数结果都说一个类不能是它自己的子类。
【问题讨论】:
-
Nizet 的回答当然是正确的,如果您只是错过了他解释的要点,那么一切都很好。但是,泛型很快就会变得非常混乱,如果您觉得需要对这个特定案例进行更广泛的解释,我可以尝试给出一个。
标签: java list generics collections wildcard