簡體   English   中英

JDK 1.7破壞了向后兼容性? (泛型)

[英]JDK 1.7 breaks backward compatibility? (generics)

我發現了類似的主題,但過於復雜且不盡相同。 事情就是這樣。 這是(最小)代碼,在1.6上可以使用,但不能使用1.7 javac進行編譯。

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.7有問題時,為什么我們可以在項目中使用此代碼進行編譯並在1.6中運行。 怎么了? 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中工作,我相信重構是您唯一的選擇。

它是Java 7中已修復的Javac錯誤之一-您可以在發行說明中找到更多信息。 如果您想切換到Java 7,恐怕唯一的選擇就是重寫該代碼。

領域 :工具
簡介 :類不能定義兩個具有相同擦除簽名但兩個不同返回類型的方法
描述 :一個類不能定義兩個具有相同擦除簽名的方法,無論返回類型是否相同。 這是從JLS Java SE 7 Edition的8.4.8.3開始的。 JDK 6編譯器允許具有相同擦除簽名但返回類型不同的方法。 此行為不正確,並且已在JDK 7中修復。
范例

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

該代碼在JDK 5.0和JDK 6下編譯,在JDK 7下被拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM