Come menzionato in altre risposte, è stata aggiunta la possibilità di aggiungere l'implementazione a un'interfaccia al fine di fornire la compatibilità con le versioni precedenti nel framework Collezioni. Direi che fornire compatibilità con le versioni precedenti è potenzialmente l'unica buona ragione per aggiungere l'implementazione a un'interfaccia.
Altrimenti, se aggiungi l'implementazione a un'interfaccia, stai infrangendo la legge fondamentale per cui le interfacce sono state aggiunte in primo luogo. Java è un unico linguaggio ereditario, a differenza del C ++ che consente l'ereditarietà multipla. Le interfacce offrono i vantaggi di battitura che derivano da un linguaggio che supporta l'ereditarietà multipla senza introdurre i problemi che derivano dall'ereditarietà multipla.
Più specificamente, Java consente solo l'ereditarietà singola di un'implementazione, ma consente l'ereditarietà multipla delle interfacce. Ad esempio, il seguente è un codice Java valido:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
eredita una sola implementazione, ma eredita tre contratti.
Java ha trasmesso eredità multipla dell'implementazione perché l'eredità multipla dell'implementazione comporta una serie di problemi spinosi, che esulano dallo scopo di questa risposta. Sono state aggiunte interfacce per consentire l'ereditarietà multipla dei contratti (ovvero interfacce) senza i problemi dell'ereditarietà multipla dell'implementazione.
A supporto del mio punto, ecco una citazione di Ken Arnold e James Gosling del libro The Java Programming Language, 4a edizione :
La singola eredità preclude alcuni progetti utili e corretti. I problemi dell'ereditarietà multipla derivano dall'ereditarietà multipla dell'implementazione, ma in molti casi l'ereditarietà multipla viene utilizzata per ereditare una serie di contratti astratti e forse un'implementazione concreta. Fornire un mezzo per ereditare un contratto astratto senza ereditare un'implementazione consente i vantaggi di battitura dell'eredità multipla senza i problemi dell'eredità multipla dell'implementazione. L'eredità di un contratto astratto è definita
eredità dell'interfaccia . Il linguaggio di programmazione Java supporta l'ereditarietà dell'interfaccia consentendo di dichiarare un interface
tipo