【发布时间】:2012-12-20 16:56:56
【问题描述】:
我从 Joshua Bloch 的一次 google I/O 益智演讲中得到了这个。这是代码
public class Glommer<T> {
String glom(Collection<?> obj){
String result = "";
for(Object o : obj){
result += o;
}
return result;
}
int glom(List<Integer> ints){
int result = 0;
for(int i : ints){
result += i;
}
return result;
}
public static void main(String args[]){
List<String> strings = Arrays.asList("1", "2", "3");
System.out.println(new Glommer().glom(strings));
}
这个 main 方法抛出一个异常,因为 new Glommer 是一个原始类型,因此 Glommer 中的所有泛型都被删除了,所以它最终调用 int glom(List<Integer> ints) 而不是 String glom(Collection<?> obj)。
我的问题是,即使我将glom() 称为new Glommer<Integer>().glom(strings),它也不应该调用int glom(List<Integer> ints) 方法,因为由于类型擦除,此方法实际上是int glom(List ints) 和strings 的类型为@987654331 @不是Collection?
【问题讨论】: