为批注字段设置默认空值时出错

2022-08-31 11:36:58

为什么我收到错误“属性值必须是常量”。不是常量吗???

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeInterface {
    Class<? extends Foo> bar() default null;// this doesn't compile
}

答案 1

我不知道为什么,但JLS很清楚:

 Discussion

 Note that null is not a legal element value for any element type. 

默认元素的定义是:

     DefaultValue:
         default ElementValue

不幸的是,我不断发现,当您不符合语言规范时,新的语言功能(枚举和现在的注释)具有非常无用的编译器错误消息。

编辑:在JSR-308中,一些谷歌搜索发现了以下内容,他们主张在这种情况下允许空值:

我们注意到对该提案的一些可能的反对意见。

该提案没有使以前不可能实现的任何事情成为可能。

程序员定义的特殊值提供了比 null 更好的文档,null 可能意味着“无”、“未初始化”、null 本身等。

该提案更容易出错。忘记检查 null 比忘记检查显式值要容易得多。

该提案可能会使标准习语更加冗长。目前,只有注释的用户需要检查其特殊值。根据该提案,许多处理注释的工具都必须检查字段的值是否为 null,以免引发 null 指针异常。

我认为只有最后两点与“为什么不首先这样做”有关。最后一点当然提出了一个很好的观点 - 注释处理器永远不必担心他们会在注释值上获得空值。我倾向于看到,由于注释处理器和其他此类框架代码的工作必须进行这种检查以使开发人员的代码更清晰,而不是相反,但这肯定会使更改它变得困难。


答案 2

试试这个

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeInterface {
    Class bar() default void.class;
}

它不需要一个新的类,它已经是Java中的一个关键字,没有任何意义。