Tôi đã tìm thấy các chủ đề tương tự, nhưng quá phức tạp và không hoàn toàn giống nhau. Vì vậy, điều này là. Đây là (tối thiểu) mã đó là tốt trên 1,6, nhưng không biên dịch với 1,7 javac.JDK 1.7 phá vỡ tính tương thích ngược? (generics)
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();
}
}
On 1,7 lỗi là thế này:
java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure
Tôi hiểu các loại tẩy xoá và tại sao nó là một sai mã. Tôi chỉ không hiểu tại sao chúng ta có thể có mã này trong dự án của chúng tôi biên dịch và chạy trong 1.6, khi 1.7 có vấn đề với nó. Chuyện gì thế? Nó là một lỗi trong trình biên dịch 1,6 mà nó cho phép chúng ta làm như vậy? Có thể làm cho nó hoạt động trong 1,7 trừ viết lại không?
- phiên bản JDK1.6 javac: 1.6.0_43
- phiên bản JDK1.7 javac: 1.7.0_25
Cám ơn lời giải thích . Nhưng tôi vẫn không thích rằng họ đã phá vỡ khả năng tương thích ngược. – NeplatnyUdaj
@NeplatnyUdaj: Sửa lỗi không phá vỡ tính tương thích ngược. – newacct
@newacct: Tôi nghĩ rằng đó là, bởi vì rất nhiều mã có thể phụ thuộc vào nó. Bạn có biết một nhà phát triển đã đọc toàn bộ JLS không? – NeplatnyUdaj