为什么@FunctionalInterface具有RUNTIME保留?

时间:2014-11-25 08:09:00

标签: java java-8

Said in Javadoc

  

如果使用此注释类型注释类型,则编译器是   需要生成错误消息,除非......

为什么SOURCECLASS不够,例如@Override

3 个答案:

答案 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?;