为什么@FunctionalInterface具有RUNTIME保留?

在Javadoc中说 :

如果使用此批注类型对类型进行批注,则编译器需要生成错误消息,除非…

为什么SOURCECLASS不够,比如@Override

@FunctionalInterface注释有两个用途。 关于编译器及其必须生成的错误,确实足以拥有SOURCE RetentionPolicy因为在这方面它只影响使用@FunctionalInterface注释的类。

然而,它有第二个目的,记录了这样一个事实,即使用这个interface作为功​​能接口确实是有意的,并且这种方式使用它的可能性不仅仅是巧合,例如Comparable ,不打算以这种方式使用。

因此,它使用@Documented注释,并具有最大的RetentionPolicy以实现第二个目的。

“源”是不够的,因为例如,如果您创建一个API并将您的类作为预编译的jar提供,则该信息将不再可用于编译器。

如果你想支持那些在运行时“编译”类编译器的编译器,我认为“class”也是不够的,比如脚本引擎使用reflection来找出那些注释并且也应该显示警告。

@FunctionalInterface可能用于运行时reflection,编译检查和Java运行时进程。

javap用于解编译和比较两个接口,一个用@FunctionalInterface ,另一个没有。

@FunctionalInterface标记的接口中只需要额外的两行字节代码:

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

并且两个implementation / lambda express在字节代码级别都是相同的。

除界面reflection外:

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