Come menzionato in altre risposte, il motivo principale è il problema dell'eredità del diamante . Prima di Java 8, non c'erano interfacce predefinite quindi questo problema non esisteva in Java e questo era completamente intenzionale.
Una domanda diversa ma correlata potrebbe essere: "se il problema dell'ereditarietà del diamante è così grave, perché è stato introdotto in Java 8?" Per capire che è necessario comprendere perché è stata introdotta la parola chiave default
per consentire implementazioni del metodo su interfacce. Il motivo è che una volta rilasciata un'interfaccia, è stato impossibile aggiungervi qualcosa senza rompere le dipendenze esistenti su quell'interfaccia. Aggiungendo un'implementazione predefinita, le interfacce sono più libere di evolvere.
Quindi torniamo alla tua domanda. Ciò che è buono per l'oca è buono per il papero, giusto? Bene, le interfacce sono più simili alle anatre. Il punto di un metodo predefinito non è pensato per essere un posto dove aggiungere implementazioni non banali. Penso che un buon esempio del suo utilizzo sia il metodo remove () su Iterator. In passato ogni volta che volevi implementare un iteratore, dovevi specificare un metodo remove () che (nella mia esperienza) quasi sempre genera un'eccezione di operazione non supportata. L'aggiunta di default
non ha lo scopo di modificare il punto delle interfacce. È un'aggiunta pragmatica, non concettuale.
La cosa da tenere a mente con le implementazioni predefinite è che nella specifica per il binding del metodo polimorfico per Java, qualsiasi classe nella gerarchia di ereditarietà ha la precedenza su qualsiasi metodo predefinito anche se tale classe non implementa l'interfaccia che lo ha definito. Se si aggiunge l'ereditarietà multipla delle classi, questa semplice regola che è il modo più diretto per risolvere i conflitti diventa molto più complicata. Non esiste una regola corrispondente che possa essere applicata per le classi.