我在我的大学里有高级编程的课程,我对这段代码是如何工作的有一点困难。
public final class GenericClass<T> {
private void overloadedMethod(Collection<?> o) {
System.out.println("Collection<?>");
}
private void overloadedMethod(List<Number> o) {
System.out.println("List<Number>");
}
private void overloadedMethod(ArrayList<Integer> o) {
System.out.println("ArrayList<Integer>");
}
public void method(List<T> l) {
overloadedMethod(l);
}
public static void main(String[] args) {
GenericClass<Integer> test = new GenericClass<Integer>();
test.method(new ArrayList<Integer>());
}
}
为什么这段代码打印"Collection"?
发布于 2013-03-12 21:04:44
method(List<T> l)
的声明没有指定类型T的任何界限。也不能保证T是Number或Number的子类。因此,编译器只能决定此方法调用overloadedMethod(Collection<?> o)
。
记住:编译后,有关泛型的信息在类文件中不再可用。
发布于 2013-03-12 21:20:24
每当定义泛型类型时,都会自动为此方法提供相应的原始类型
public void method(List<T> l) {
}
将被替换为
public void method(List<Object> l) {
}
如果你读过通配符类型,你会看到List<Number>
和List<Object>
或者ArrayList<Integer>
和List<Object>
没有任何类型关系。List<Object>
是Collecion<?>
的子类型,因此此方法被调用。
https://stackoverflow.com/questions/15361844
复制相似问题