2013-05-26 9 views
47

Come funziona questo nuovo modello di interfaccia funziona e ciò che è di circaCome funziona il nuovo modello di interfaccia predefinito di Java 8 (inclusi diamante, ereditarietà e precedenza)?

  • il problema di diamanti che potrebbe derivare da questo
  • multipla carattere eredità di questa implementazione
  • e la precedenza con cui vengono utilizzate le implementazioni di interfacce ?
+3

Ho l'impressione che tu possa rispondere alla maggior parte delle tue domande semplicemente provandolo. –

+1

Esatto :) In realtà non sono riuscito a trovare la risposta su come è stato gestito il problema dei diamanti. Quindi l'ho provato io stesso. – Alex

risposta

12

Questa è una spiegazione dettagliata per Java 8' new interface model & the diamond problem of multiple inheritance.

Come si può vedere in questo esempio, a partire da JDK 8, Java ha introdotto una sorta di ereditarietà multipla come sia, il classe e la sua interfaccia forza contenere un implementazione dello stesso metodo (stesso nome &   firma). Per affrontare il diamante problema   c'è una precedenza in quale ordine un implementazione viene utilizzata: solo se la classe implementa tutti i metodi default/opzionali dei suoi interfacce, il codice può essere compilato e le implementazioni di questa classe sono Usato. Altrimenti il compilatore tenta di correggere le implementazioni mancanti con l'implementazione predefinita dell'interfaccia. E se esistono più implementazioni predefinite di un metodo, si verifica il problema diamante e il compilatore rifiuta la compilazione.
Il nuovo modello di interfacce Java 8 'è il risultato di che si avvicina a   retrocompatibilità, i. e. per mantenere il codice esistente scritto rispetto alle interfacce pre-Java 8 compilabili.

+1

È veramente corretto? Guardando [il link] (http://www.lambdafaq.org/what-about-the-diamond-problem/) dalla risposta di @ ruda: Il problema del diamante non si verifica se non ci sono più implementazioni predefinite a diversi livelli nel gerarchia di interfacce. Solo se esistono più implementazioni predefinite allo stesso livello. Cioè, solo se 'B' e' C' implementano il metodo. Questo non è chiaro da questa risposta. – joergl

45

C'è una spiegazione perfetta a Java Lambda FAQ.
Ecco una citazione di What about the diamond problem? articolo c'è:

interface A { 
    void m() default { ... }   
} 
interface B extends A {} 
interface C extends A {} 
class D implements B, C {} 

Nel caso iniziale (il codice precedente), l'attuazione di m ereditato da D è inequivocabilmente quello definito A - non c'è altra possibilità. Se la situazione viene modificata in modo che B dichiari anche un'implementazione predefinita di m, diventa l'implementazione che D eredita dalla regola di "implementazione più specifica".Ma se entrambi B e C fornire implementazioni di default, allora il conflitto, e D deve usare sia la sintassi X.super.m (...) di scegliere in modo esplicito uno di essi, oppure la ridichiarare metodo stesso, ignorando tutte le dichiarazioni dei supertipi.

Assicuratevi di controllare l'articolo precedente sulle regole di risoluzione delle dichiarazioni di metodo in conflitto e di altri articoli sul progetto Java Lambda: sono abbastanza buone.

+7

che suona come il caos :(precedenza? – Thufir

+1

I collegamenti sono completi - questa dovrebbe essere la risposta accettata –

+0

c'è un modo per chiedere al compilatore di eseguire l'errore piuttosto che usare la regola "implementazione più specifica"? – Sam

Problemi correlati