2014-11-25 19 views

risposta

6

L'annotazione @FunctionalInterface ha due scopi. Per quanto riguarda il compilatore e l'errore che deve generarlo sarebbe infatti sufficiente avere uno SOURCERetentionPolicy in quanto a questo proposito interessa solo la classe stessa annotata con @FunctionalInterface.

Tuttavia, ha un secondo scopo, che documenta il fatto che l'utilizzo di questa interfaccia interface è effettivamente previsto e la possibilità di utilizzarlo in questo modo non solo una coincidenza come con, ad es. Comparable che non è destinato a essere utilizzato in questo modo.

Pertanto è annotato con @Documented e ha il massimo RetentionPolicy per soddisfare il secondo scopo.

+0

Vuol ogni interfaccia @Documented hanno la massima RetentionPolicy (runtime)? – auntyellow

+0

Forse ha la risposta (http://stackoverflow.com/questions/20775614) – auntyellow

+2

@auntyellow: Non è un requisito difficile, tuttavia, lo scopo di rendere le informazioni ampiamente disponibili porta alla conclusione che di solito si desidera * la massima conservazione . Tra l'altro, 'RetentionPolicy.CLASS' non offre alcun vantaggio rispetto a' RUNTIME'. Consuma la stessa quantità di spazio all'interno di un file di classe e poiché Reflection carica le annotazioni solo su richiesta, non vi è alcun vantaggio nel non essere disponibile all'interno del runtime. – Holger

2

"Source" non sarebbe sufficiente, poiché se ad esempio si crea un'API e si fornisce la classe come un vaso precompilato, le informazioni non sarebbero più disponibili per il compilatore.

Credo che "classe" non sarebbe sufficiente se si desidera supportare quei tipi di compilatori che "compilano" contro una classe in fase di esecuzione, come i motori di scripting che utilizzano la riflessione per scoprire tali annotazioni e devono mostrare un avviso , pure.

1

@FunctionalInterface è probabilmente per riflessione di runtime, controllo di compilazione e processo di runtime Java.

javap viene utilizzato per decompilare e confrontare due interfacce, una con @FunctionalInterface, l'altra nessuna.

soli altri due righe BYTE Codice in @FunctionalInterface interfaccia etichettato:

Constant pool: 
    #7 = ... RuntimeVisibleAnnotations 
    #8 = ... Ljava/lang/FunctionalInterface; 

Ed entrambi implementazione/lambda espresso sono gli stessi a livello di byte di codice.

Fatta eccezione per l'interfaccia riflessione:

X.class.getAnnotation(FunctionalInterface.class) == null?; 
Problemi correlati