当前位置: 代码迷 >> java >> 为什么在注释中禁止 null 作为默认值?
  详细解决方案

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

热度:99   发布时间:2023-07-27 09:21:42.0

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

需要注意的是null不仅不支持为默认值,它是不支持的,如一般的注释值。

规定:

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

  • T是数组类型E[] ,并且:
    • 如果VConditionalExpressionAnnotation ,则VE相称; 或者

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

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

  • T不是数组类型,并且V的类型与T赋值兼容(第),并且:
    • 如果T是原始类型或String ,则V是常量表达式(第)。
    • 如果TClassClass的调用( Class ),则V是类文字(第)。
    • 如果T是枚举类型 ( ),则V是枚举常量 ( )。
    • V不为null

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

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

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

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

因此, null并未从合法结构集中删除,也从未添加过。 对于考虑过的用例,既不直接也不自然地包含也不立即需要。

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

  相关解决方案