为什么 null 被禁止作为注释中的默认值?

Why is null forbidden as default value in annotations?

根据Annotation default "null" value,空值被禁止作为注释中的默认值。 我想知道为什么。这是什么原因?

请注意,null 不仅不支持作为默认值,而且不支持作为注释值 通常

JLS §9.7.1 指定:

It is a compile-time error if the element type is not commensurate with the element value. An element type T is commensurate with an element value V if and only if one of the following is true:

  • T is an array type E[], and either:
    • If V is a ConditionalExpression or an Annotation, then V is commensurate with E; or

    • If V is an ElementValueArrayInitializer, then each element value that V contains is commensurate with E.

      An ElementValueArrayInitializer is similar to a normal array initializer (§10.6), except that an ElementValueArrayInitializer may syntactically contain annotations as well as expressions and nested initializers. However, nested initializers are not semantically legal in an ElementValueArrayInitializer because they are never commensurate with array-typed elements in annotation type declarations (nested array types not permitted).

  • T is not an array type, and the type of V is assignment compatible (§5.2) with T, and:
    • If T is a primitive type or String, then V is a constant expression (§15.29).
    • If T is Class or an invocation of Class (§4.5), then V is a class literal (§15.8.2).
    • If T is an enum type (§8.9), then V is an enum constant (§8.9.1).
    • V is not null.

禁止 null 的最后一个项目符号可能看起来很武断,但即使没有那个项目符号,null 也不是合法值,因为它既不是常量表达式,又是 class文字,也不是枚举常量。

所以最后一个项目符号只是明确表示这不是疏忽。

当注释被添加到语言中时,编译时常量的定义就已经存在,包括用于存储它们的字节码格式。 Class 字面值也有句法定义,但与常量不相上下。但是有了 JDK-4662563,它们的字节码格式就变得等同于同一版本中其他常量的格式。因此,对 class 文字的支持对于注释来说也是自然的。

为注释支持而独特添加的唯一功能是对枚举常量的引用和数组的存储格式。两者都立即证明了它们的有用性,因为注解定义本身需要内置注解,@RetentionTarget 都使用枚举常量,后者也使用数组。

因此,null 并未从合法构造集中移除,它从未被添加。对于所考虑的用例,既不是直接或自然地包含也不是立即需要的。

This answer shows that a suggestion to add support for null had been considered initially for the type annotation proposal (see also the archive link),此时提出反对意见。众所周知,类型注释是在 Java 8 中引入的,对 null 的支持不是(其他建议,如可重复注释,已纳入语言)。