2015-05-11 14 views

risposta

31

È possibile avere metodi predefiniti in un functional interface ma il suo contratto richiede di fornire un singolo metodo astratto (o SAM). Poiché un metodo predefinito ha un'implementazione, non è astratto.

Concettualmente, un'interfaccia funzionale ha esattamente un metodo astratto. Poiché i metodi predefiniti hanno un'implementazione, non sono astratti.

e

Se un tipo è annotata con questo tipo di annotazione, compilatori sono necessari per generare un messaggio di errore a meno che:

Il tipo è un tipo di interfaccia e non un tipo di annotazione, enum, o classe .

Il tipo annotato soddisfa i requisiti di un'interfaccia funzionale .

Qui non si soddisfa il requisito dell'interfaccia funzionale, quindi è necessario fornire un metodo astratto. Per esempio:

@FunctionalInterface 
interface MyInterface { 

    boolean authorize(int val); 

    default boolean authorize(String value) { 
     return true; 
    } 
} 

Si noti che se si dichiara un metodo astratto override uno di un metodo pubblico dalla classe dell'oggetto non conta, perché qualsiasi implementazione di questa interfaccia avrà un applicazione di tali metodi attraverso almeno la classe dell'oggetto. Ad esempio:

@FunctionalInterface 
interface MyInterface { 

    default boolean authorize(String value) { 
     return true; 
    } 

    boolean equals(Object o); 
} 

non viene compilato.

+1

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

+1

@Holger Sì, questo è quello che intendevo. L'ho aggiornato per renderlo più chiaro. –

4

Questo perché @FunctionalInterface possono avere metodi predefiniti, come molti come si desidera. Ad esempio, considerare l'interfaccia java.util.Function. Contiene due metodi predefiniti: compose e andThen. Ma dovrebbe esserci esattamente un metodo non predefinito. Altrimenti come il compilatore saprebbe quale dei tuoi metodi di default dovrebbe essere mappato a lambda?

10

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.

Problemi correlati