2014-07-06 18 views
9

Perché Java 8 non consente di aggiungere un'implementazione predefinita per toString() in un'interfaccia?Perché non è consentito aggiungere toString() all'interfaccia come metodo predefinito?

public interface SomeInterface { 
    @Override 
    default String toString(){ 
     return ""; 
    } 
} 

Questo è il messaggio di errore:

Error:(8, 20) java: default method toString in interface task1_3. 
SomeInterface overrides a member of java.lang.Object 
+8

http://mail.openjdk.java.net/pipermail/lambda-dev/2013-March/008435.html – Maroun

+0

@ MarounMaroun Grazie per il collegamento. – visil

risposta

10

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.

Problemi correlati