JDK 1.7打破了向后兼容性?(仿制药)



我发现了类似的主题,但过于复杂,不太一样。事情是这样的。这是(最小)代码,它在1.6上很好,但不使用1.7javac编译。

public class Test {
    private static class A<T>{};
    private static class B{};
    private static class C{};
    B doSomething(A<B> arg){
        return new B();
    }
    C doSomething(A<C> arg){
        return new C();
    }
}

在1.7上,错误如下:

java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure

我理解类型擦除以及为什么它是错误的代码。我只是不明白为什么我们的项目中可以在1.6中编译和运行这些代码,而1.7却有问题。怎么了?1.6编译器允许我们这样做,这是一个错误吗?除了重写之外,还有可能在1.7中使其工作吗?

  • JDK1.6 javac版本:1.6.0_43
  • JDK1.7 javac版本:1.7.0_25

你说得很对,在JLS3下,这段代码本不应该编译,而这是1.6中的一个错误。

对于1.7版本,大部分底层类型系统都进行了更新,并修复了这个错误,结果是以一些向后兼容性问题为代价进行了更好的类型处理。

至于让它在1.7中发挥作用,我相信重新保理是你唯一的选择。

这是Java7中修复的javac错误之一,您可以在发行说明中找到更多信息。如果您想切换到Java7,恐怕您唯一的选择就是重写该代码。

区域:工具
简介:一个类不能定义两个具有相同擦除签名但返回类型不同的方法
描述:无论返回类型是否相同,类都不能定义具有相同擦除签名的两个方法。以下内容来自JLS Java SE 7 Edition第8.4.8.3节。JDK6编译器允许具有相同擦除签名但不同返回类型的方法;此行为不正确,已在JDK7中修复。
示例

class A {
    int m(List<String> ls) { return 0; }
   long m(List<Integer> ls) { return 1; }
}

此代码在JDK5.0和JDK6下编译,在JDK7下被拒绝。

最新更新