答案 0 :(得分:6)
@FunctionalInterface
注释有两个目的。关于编译器及其必须生成的错误,确实足以拥有SOURCE
RetentionPolicy
,因为在这方面它仅影响使用@FunctionalInterface
注释的类。
然而,它有第二个目的,记录了使用这个interface
作为功能界面的事实确实是有意的,并且以这种方式使用它的可能性不仅仅是例如巧合,例如Comparable
不打算以这种方式使用。
因此,它使用@Documented
注释,并且具有最大RetentionPolicy
以实现第二个目的。
答案 1 :(得分:2)
“Source”是不够的,因为例如,如果您创建一个API并将您的类作为预编译的jar提供,则该信息将不再可用于编译器。
如果你想支持那些在运行时“编译”类的编译器,我认为“class”也是不够的,比如脚本引擎使用反射来找出那些注释并应该显示警告,太。
答案 2 :(得分:1)
@FunctionalInterface
可能用于运行时反射,编译检查和Java运行时进程。
javap 用于对两个接口进行解编译和比较,一个接口为@FunctionalInterface
,另一个接口为无接口。
@FunctionalInterface
标记的接口中只有两行字节代码:
Constant pool:
#7 = ... RuntimeVisibleAnnotations
#8 = ... Ljava/lang/FunctionalInterface;
两个implementation / lambda express在字节码级别都是相同的。
除了界面反射:
X.class.getAnnotation(FunctionalInterface.class) == null?;