[英]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中工作?
沒錯,在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.