我正在研究" Java Generics and Collections"书,并遇到了这段代码,它应该编译和运行没有错误
class Overloaded {
public static Integer sum(List<Integer> ints) {
int sum = 0;
for (int i : ints) sum += i;
return sum;
}
public static String sum(List<String> strings) {
StringBuffer sum = new StringBuffer();
for (String s : strings) sum.append(s);
return sum.toString();
}
}
但是,此示例无法编译并显示错误
错误:(16,26)java:name clash:sum(java.util.List) 和sum(java.util.List)具有相同的擦除
我能理解为什么这是一个错误。但是,本书特别提到这是允许的,因为编译器可以根据返回类型区分这两种方法。
然后我找到了这个帖子 Type Erasure and Overloading in Java: Why does this work?它还建议这个例子应该编译。知道什么导致编译失败?
我正在使用JDK 1.8。这最近是用Java 1.8改变的吗?如果这是相关的,我使用最新的IntelliJ IDEA作为IDE。
答案 0 :(得分:5)
众所周知,在运行时中, Java 将删除泛型类型,因此:
Integer sum(List<Integer> ints)
String sum(List<String> strings)
将转换为运行时:
Integer sum(List ints)
String sum(List strings)
所以应该抛出编译器错误。
它编译时没有在 JDK6 中抛出错误它是一个错误。此错误已在 JDK7 中修复,因此使用 JDK8 进行编译将引发此编译错误。
参考: