Questo viene fatto per evitare problemi con l'ereditarietà multipla.
La regola generale è che un oggetto non può ereditare due implementazioni di un singolo metodo. Questa regola si applica in diverse situazioni - per esempio, quando si tenta di attuazione di due interfacce, entrambi con lo stesso metodo con le implementazioni di default:
interface Animal {
default void saySomething() {
System.out.println("Something");
}
}
interface Cat {
default void saySomething() {
System.out.println("Meow");
}
}
class Tiger implements Animal, Cat {
// Restricted
}
è necessario sovrascrivere saySomething()
nella classe Tiger
sopra; altrimenti la classe non verrà compilata.
Allo stesso modo, quando si fornisce un'implementazione predefinita di toString
metodo s' il java.lang.Object
in un'interfaccia, si stanno introducendo un'ambiguità, perché ogni classe che implementa l'interfaccia potrebbe anche ereditare da Object
in un modo o l'altro, in modo che il compilatore è necessario decidere tra due implementazioni (nonostante il fatto che si stia tentando di comunicare al compilatore tramite l'attributo @override
che si desidera che l'implementazione predefinita vinca). Per risolvere questa ambiguità, il compilatore richiederebbe tutte le classi che implementano SomeInterface
per sovrascrivere anche toString
. Tuttavia, ciò significa che l'implementazione predefinita non verrà mai utilizzata. Quindi, la lingua proibisce di fornirlo in primo luogo.
http://mail.openjdk.java.net/pipermail/lambda-dev/2013-March/008435.html – Maroun
@ MarounMaroun Grazie per il collegamento. – visil