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

mmi*_*ldt 3 java null annotations default-value

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

Hol*_*ger 5

请注意,null不仅不支持的为默认值,它是不支持的注释值一般

JLS §9.7.1规定:

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

  • T是一个数组类型E[],并且:
    • 如果VConditionalExpressionAnnotation,则对应VE; 或者

    • 如果VElementValueArrayInitializer,则V包含的每个元素值都与 相称E

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

  • T不是数组类型,并且 的类型与V赋值兼容(第5.2 节T,并且:
    • 如果T是原始类型 or String,则V是常量表达式(第15.29 节)。
    • 如果TClass或调用Class§4.5),则V是类文字(§15.8.2)。
    • 如果T是枚举类型(第8.9 节),则V是枚举常量(第8.9.1 节)。
    • V不是null

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

所以最后一个要点只是明确表示这不是疏忽。

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

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

所以,null没有从法律结构中删除,它从未被添加。对于考虑过的用例,既不直接也不自然地包含也不立即需要。

此答案表明,null最初已考虑为类型注释提案添加支持的建议(另请参阅存档链接),此时提出了反对意见。众所周知,Java 8 引入了类型注解,不支持null(其他建议,如可重复注解,已纳入语言)。