Un interfaccia funzionale è un interface
avente un unico astratto metodo. L'intero scopo della definizione di interfacce funzionali è quello di consentire l'implementazione del singolo metodo astratto tramite espressioni lambda che sovrascriveranno efficacemente quel metodo che rende inutile l'implementazione di default
.
Avere uno interface
costituito interamente da metodi default
solleva più problemi. C'è il problema tecnico che il compilatore non può decidere per un'espressione lambda quale metodo implementare quando ci sono più metodi default
e c'è il problema semantico che uno interface
composto interamente da metodi default
non è abstract
.Non è possibile creare un'istanza di questo comportamento predefinito in quanto non è possibile creare istanze interface
e imporre ai programmatori la creazione di classi concrete solo per richiamare il comportamento predefinito, che, poiché le interfacce sono prive di stato, potrebbe essere fornito da un singleton:
@FunctionalInterface
public interface MyInterface {
static MyInterface DEFAULT = s->true;
boolean authorize(String value);
}
Si noti che è possibile avere interfacce che estendono un'interfaccia funzionale e forniscono un metodo predefinito, se necessario. Tuttavia, se ciò comporta la creazione di un interface
senza metodi astratti, metterei in discussione il progetto. Puoi confrontare con lo discussion about marker interfaces with default
methods. Se l'interfaccia secondaria avrà diversi metodi astratti rispetto all'interfaccia funzionale, è una storia diversa. Potrebbero esserci casi di utilizzo reali, ma queste sub-interfacce mostreranno anche perché non dovrebbero essere combinati con la base funzionale interface
poiché un'espressione lambda implementerà sempre il metodo astratto.
L'ultima frase è molto fuorviante. Probabilmente vuoi dire "metodi astratti la cui firma corrisponde a un metodo dichiarato in' java.lang.Object' ". Il punto importante è che la * dichiarazione * in una classe concreta ha la precedenza, anche se una sottoclasse la sovrascrive con un metodo 'abstract'. Il metodo 'abstract' di una classe non-'interface' ha ancora la precedenza sui metodi' interface', anche se questi ultimi non sono 'abstract'. – Holger
@Holger Sì, questo è quello che intendevo. L'ho aggiornato per renderlo più chiaro. –