Các mã sau đây hoạt động khi biên soạn với sourceCompatibility = 1,7 hoặc 1,6, nhưng thất bại sau khi chuyển sang 1.8:Tại sao mã này thất bại với sourceCompatibility = 1,8
public class Java8Wat {
interface Parcelable {
}
static class Bundle implements Parcelable {
public void put(Parcelable parcelable) {
}
public void put(Serializable serializable) {
}
public <T extends Parcelable> T getParcelable() {
return null;
}
}
static {
Bundle inBundle = new Bundle();
Bundle outBundle = new Bundle();
outBundle.put(inBundle.getParcelable());
}
}
Compilation đầu ra:
Java8Wat.java:23: error: reference to put is ambiguous
outBundle.put(inBundle.getParcelable());
^
both method put(Parcelable) in Bundle and method put(Serializable) in Bundle match
Dưới đây là mã repo có mã lỗi: https://github.com/chalup/java8-wat. Chỉ cần gọi ./gradlew clean build
từ thư mục dự án.
Tôi lướt qua JLS cho Java 8, nhưng tôi chưa tìm thấy bất kỳ điều gì có liên quan.
quan sát khác: mã biên dịch nếu tôi thay đổi chữ ký getParcelable()
tới:
public Parcelable getParcelable()
Tại sao biên dịch java coi put(Serializable)
là phương pháp có khả năng áp dụng cho outBundle.put(inBundle.getParcelable())
cuộc gọi và những thay đổi cần được thực hiện để lớp Parcelable/Bundle ? Câu hỏi bổ sung: tại sao lỗi này chỉ xảy ra trên Java 8 chứ không phải trên Java 7?
Liên quan: [Phương pháp mơ hồ trong Java 8, tại sao?] (Http://stackoverflow.com/questions/29499847/ambiguous-method-in-java-8-why) –
Tôi sẽ đăng câu trả lời. Oh well. ; p – Radiodef