Poniższy kod działa, gdy skompilowany z sourceCompatibility = 1,7 lub 1,6, ale nie po włączeniu do 1,8:Dlaczego ten kod nie z 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());
}
}
Kompilacja wyjściowa:
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
Oto repo z błędnym kodem: https://github.com/chalup/java8-wat. Wystarczy wywołać ./gradlew clean build
z katalogu projektu.
Przeszedłem przez JLS dla Javy 8, ale nie znalazłem nic istotnego.
Dodatkowe obserwacje: kod kompiluje jeśli zmienić podpis getParcelable()
do:
public Parcelable getParcelable()
Dlaczego Java kompilator uzna put(Serializable)
być potencjalnie stosowane metody outBundle.put(inBundle.getParcelable())
rozmowy i jakie zmiany należy wprowadzić do klasy Parcelable/Bundle ? Dodatkowe pytanie: dlaczego ten błąd występuje tylko w Java 8, a nie w Java 7?
Powiązane: [Niejednoznaczna metoda w języku Java 8, dlaczego?] (Http://stackoverflow.com/questions/29499847/ambiguous-method-in-java-8-why) –
Zamierzałem opublikować odpowiedź. No cóż. ; p – Radiodef