【问题标题】:Default null value for annotation fields in JavaJava中注释字段的默认空值
【发布时间】:2020-01-22 20:58:04
【问题描述】:

我正在创建一个自定义注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFramework {

    public Integer index() default null; // Compiler complains here

}

编译器抱怨null 是不允许的。我不想让索引字段原始类型int,因为它没有意义。有没有办法为注释字段设置默认的null 值?

Error setting a default null value for an annotation's field 的答案提到了Class 类型,因此解决方案有效,但不适用于IntegerDouble 等。

【问题讨论】:

    标签: java annotations


    【解决方案1】:

    您不能使用null 作为默认(或非默认)值。 Java 语言规范 (JLS) 明确禁止使用null。来自§9.6.2 of the JLS

    如果元素的类型(§9.7)与指定的默认值不相称,则为编译时错误。

    来自§9.7.1 of the JLS

    如果元素类型与元素值不相称,则为编译时错误。当且仅当满足以下条件之一时,元素类型 T 与元素值 V 相称

    • T 是数组类型E[],并且:

      • 如果VConditionalExpressionAnnotation,则VE 相称;或
      • 如果V 是一个ElementValueArrayInitializer,那么V 包含的每个元素值都与E 相称。

        ElementValueArrayInitializer 类似于普通的数组初始值设定项(第 10.6 节),不同之处在于 ElementValueArrayInitializer 在语法上可能包含注释以及表达式和嵌套初始值设定项。但是,嵌套初始化器在 ElementValueArrayInitializer 中在语义上是不合法的,因为它们永远不会与注释类型声明中的数组类型元素相称(不允许嵌套数组类型)。

    • T 不是数组类型,V 的类型与T 的赋值兼容(§5.2),并且:

      • 如果T 是原始类型或String,则V 是常量表达式(第15.28 节)。
      • 如果TClassClass 的调用(第4.5 节),那么V 是一个类文字(第15.8.2 节)。
      • 如果 T 是枚举类型(第 8.9 节),则 V 是枚举常量(第 8.9.1 节)。
      • V 不是 null

    请注意,如果T 不是数组类型或注释类型,则元素值必须是 ConditionalExpression(第 15.25 节)。使用 ConditionalExpression 而不是像 Expression 这样的更一般的产生式是一种语法技巧,可以防止将赋值表达式作为元素值。由于赋值表达式不是常量表达式,因此它不能是基元或String-typed 元素的相应元素值。

    [...]

    最后一个要点,“V is not null”,这就是编译错误的原因。

    如果您想要一个表示“未设置”的默认值,请使用非空标记值。例如,如果负数永远不是有效值,那么您可以使用任何负数(例如-1Integer.MIN_VALUE 等)作为默认值。例如:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MyFramework {
    
      // note the "public" modifier is implicitly added
      Integer index() default Integer.MIN_VALUE;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2022-09-24
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多