2014-11-25 82 views

回答

6

@FunctionalInterface注释有两个目的。关于编译器和它必须产生的错误,确实就足够了,因为在这方面,它只影响用@FunctionalInterface注解的类。

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

因此它被注解为@Documented并且具有最大值RetentionPolicy来完成第二个目的。

+0

是否每个@Documented接口具有最大的RetentionPolicy(RUNTIME)? – auntyellow 2014-11-25 10:45:55

+0

也许得到了答案(http://stackoverflow.com/questions/20775614) – auntyellow 2014-11-25 10:58:12

+2

@auntyellow:这不是一个硬性要求,但是,它的目的是使信息广泛可用导致的结论,你通常*希望*最大保留。顺便说一句'RetentionPolicy.CLASS'没有提供比'RUNTIME'更好的优势。它在类文件中消耗相同数量的空间,并且由于Reflection仅在需求上加载注释,所以在运行时内不可用也没有好处。 – Holger 2014-11-25 11:18:03

2

“Source”是不够的,因为如果您创建了一个API并将您的类作为预编译的jar提供,那么该编译器将不再提供这些信息。

如果您想要支持那些在运行时针对类进行“编译”的编译器,比如使用反射查找这些注释的脚本引擎,并且应该显示警告,那么我认为“类”也不够用也是。

1

@FunctionalInterface可能用于运行时反射,编译检查和java运行时进程。

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

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

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

而且两者执行/λ快递是在字节代码级别相同。

除了界面反射:

X.class.getAnnotation(FunctionalInterface.class) == null?; 
相关问题