[英]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
類型,因此解決方案有效,但不適用於Integer
, Double
等。
您不能使用null
作為默認(或非默認)值。 Java 語言規范(JLS) 明確禁止使用null
。 從JLS 的 §9.6.2 開始:
如果元素的類型與指定的默認值不相稱(第9.7 節),則會出現編譯時錯誤。
如果元素類型與元素值不相稱,則會出現編譯時錯誤。 當且僅當以下條件之一為真時,元素類型
T
與元素值V
相稱:
T
是數組類型E[]
,並且:
- 如果
V
是ConditionalExpression或Annotation ,則V
與E
相稱; 或者如果
V
是ElementValueArrayInitializer ,則V
包含的每個元素值都與E
相稱。ElementValueArrayInitializer 類似於普通數組初始值設定項(第 10.6 節),除了 ElementValueArrayInitializer 可能在語法上包含注釋以及表達式和嵌套初始值設定項。 但是,嵌套初始化器在 ElementValueArrayInitializer 中在語義上不合法,因為它們永遠不會與注釋類型聲明中的數組類型元素相稱(不允許嵌套數組類型)。
T
不是數組類型,並且V
的類型與T
賦值兼容(第 5.2 節),並且:
- 如果
T
是原始類型或String
,則V
是常量表達式(第 15.28 節)。- 如果
T
是Class
或Class
的調用(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
”,這就是編譯錯誤的原因。
如果您想要一個表示“未設置”的默認值,請使用非空標記值。 例如,如果負數永遠不是有效值,那么您可以使用任何負數(例如-1
、 Integer.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.