为什么@FunctionalInterface具有RUNTIME保留?
在Javadoc中说 :
如果使用此批注类型对类型进行批注,则编译器需要生成错误消息,除非…
为什么SOURCE
或CLASS
不够,比如@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?;