Il seguente codice funziona quando si compila con sourceCompatibility = 1.7 o 1.6, ma non riesce dopo il passaggio a 1,8:Perché questo codice non riescono con 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 uscita:
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
Ecco il repository con codice in errore: https://github.com/chalup/java8-wat. Basta invocare ./gradlew clean build
dalla directory del progetto.
Ho sfogliato JLS per Java 8, ma non ho trovato nulla di rilevante.
Ulteriori osservazione: il codice viene compilato se cambio la firma getParcelable()
a:
public Parcelable getParcelable()
Perché il compilatore java considera put(Serializable)
ad essere metodo potenzialmente applicabili per outBundle.put(inBundle.getParcelable())
chiamata e quali cambiamenti dovrebbe essere fatto per classe Parcelable/Bundle ? Domanda bonus: perché questo errore si verifica solo su Java 8 e non su Java 7?
Correlato: [Metodo ambiguo in Java 8, perché?] (Http://stackoverflow.com/questions/29499847/ambiguous-method-in-java-8-why) –
Stavo per pubblicare una risposta. Oh bene. ; p – Radiodef