Java泛型在类型擦除后命名冲突

时间:2017-06-06 08:29:10

标签: java generics

我正在研究" 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。

1 个答案:

答案 0 :(得分:5)

众所周知,在运行时中, Java 删除泛型类型,因此:

Integer sum(List<Integer> ints)
String sum(List<String> strings)

将转换为运行时

Integer sum(List ints)
String sum(List strings)

所以应该抛出编译器错误

它编译时没有在 JDK6 中抛出错误它是一个错误。此错误已在 JDK7 中修复,因此使用 JDK8 进行编译将引发此编译错误。

参考:

Generic class compiles in Java 6, but not Java 7