簡體   English   中英

Java 中注釋字段的默認空值

[英]Default null value for annotation fields in Java

我正在創建自定義注釋

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

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

}

編譯器抱怨null是不允許的。 我不想將索引字段設為原始類型int因為它沒有意義。 有沒有辦法為注釋字段設置默認null值?

Error 為注釋的字段設置默認空值時的答案提到了Class類型,因此解決方案有效,但不適用於IntegerDouble等。

您不能使用null作為默認(或非默認)值。 Java 語言規范(JLS) 明確禁止使用null JLS 的 §9.6.2 開始

如果元素的類型與指定的默認值不相稱(第9.7 節),則會出現編譯時錯誤。

JLS 的 §9.7.1 開始

如果元素類型與元素值不相稱,則會出現編譯時錯誤。 當且僅當以下條件之一為真時,元素類型T與元素值V相稱

  • T是數組類型E[] ,並且:

    • 如果VConditionalExpressionAnnotation ,則VE相稱; 或者
    • 如果VElementValueArrayInitializer ,則V包含的每個元素值都與E相稱。

      ElementValueArrayInitializer 類似於普通數組初始值設定項(第 10.6 節),除了 ElementValueArrayInitializer 可能在語法上包含注釋以及表達式和嵌套初始值設定項。 但是,嵌套初始化器在 ElementValueArrayInitializer 中在語義上不合法,因為它們永遠不會與注釋類型聲明中的數組類型元素相稱(不允許嵌套數組類型)。

  • T不是數組類型,並且V的類型與T賦值兼容(第 5.2 節),並且:

    • 如果T是原始類型或String ,則V是常量表達式(第 15.28 節)。
    • 如果TClassClass的調用( Class 4.5 節),則V是類文字(第 15.8.2 節)。
    • 如果T是枚舉類型(第 8.9 節),則V是枚舉常量(第 8.9.1 節)。
    • V不為null

請注意,如果T不是數組類型或注釋類型,則元素值必須是 ConditionalExpression(第 15.25 節)。 使用 ConditionalExpression 而不是像 Expression 這樣的更一般的產生式是一種語法技巧,可以防止將賦值表達式作為元素值。 由於賦值表達式不是常量表達式,因此它不能是原始或String類型元素的相應元素值。

[...]

這是最后一個要點,“ 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM