¿Por qué @FunctionalInterface tiene una retención de RUNTIME?

Dicho en Javadoc :

Si un tipo se anota con este tipo de anotación, los comstackdores deben generar un mensaje de error a menos que …

¿Por qué la SOURCE o CLASS no es suficiente, como para @Override .

La anotación @FunctionalInterface tiene dos propósitos. En cuanto al comstackdor y el error que tiene que generar, sería suficiente tener una SOURCE RetentionPolicy ya que a este respecto solo afecta a la clase anotada con @FunctionalInterface .

Sin embargo, tiene un segundo propósito, documentando el hecho de que el uso de esta interface como interface funcional está destinado y la posibilidad de usarlo de esta manera no es solo una coincidencia como con, por ejemplo, Comparable que no está destinado a ser utilizado de esa manera.

Por lo tanto, está anotado con @Documented y tiene la RetentionPolicy máxima para cumplir el segundo propósito.

“Fuente” no sería suficiente, ya que si, por ejemplo, creas una API y proporcionas tu clase como un contenedor previamente comstackdo, la información ya no estará disponible para el comstackdor.

Creo que la “clase” tampoco sería suficiente si desea admitir ese tipo de comstackdores que “comstackn” contra una clase en tiempo de ejecución, como los motores de guiones que utilizan la reflexión para descubrir esas anotaciones y también deben mostrar una advertencia.

@FunctionalInterface es para la reflexión en tiempo de ejecución, la comstackción de verificación y el proceso de ejecución de Java probablemente.

javap se usa para @FunctionalInterface y comparar dos interfaces, una con @FunctionalInterface , la otra ninguna.

Solo dos líneas adicionales de código de bytes en la interfaz etiquetada @FunctionalInterface :

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

Y tanto la implementación como lambda express son iguales a nivel de código de byte.

Excepto por la reflexión de la interfaz:

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