Java 为什么在注释中禁止将null作为默认值?
根据,在注释中禁止将空值作为默认值。Java 为什么在注释中禁止将null作为默认值?,java,null,annotations,default-value,Java,Null,Annotations,Default Value,根据,在注释中禁止将空值作为默认值。 我想知道为什么。原因是什么?请注意,null不仅不支持作为默认值,而且通常不支持作为注释值 指定: 如果元素类型与元素值不相称,则为编译时错误。元素类型T与元素值V相称,当且仅当以下一项为真时: T是数组类型E[],并且: 如果V是条件表达式或注释,则V与E相称;或 如果V是元素值数组初始化器,则V包含的每个元素值都与E相称 ElementValueArrayInitializer类似于普通数组初始值设定项(),只是ElementValueArrayI
我想知道为什么。原因是什么?请注意,
null
不仅不支持作为默认值,而且通常不支持作为注释值
指定:
如果元素类型与元素值不相称,则为编译时错误。元素类型T
与元素值V
相称,当且仅当以下一项为真时:
是数组类型T
,并且:E[]
- 如果
是条件表达式或注释,则V
与V
相称;或E
- 如果
是元素值数组初始化器,则V
包含的每个元素值都与V
相称 ElementValueArrayInitializer类似于普通数组初始值设定项(),只是ElementValueArrayInitializer可以在语法上包含注释、表达式和嵌套的初始值设定项。但是,嵌套的初始值设定项在ElementValueArrayInitializer中在语义上是不合法的,因为它们永远不会与注释类型声明中的数组类型元素相称(不允许嵌套数组类型)E
- 如果
不是数组类型,T
的类型与V
的赋值兼容(),并且:T
- 如果
是基元类型或T
,则String
是常量表达式()V
- 如果
是T
或调用Class
(),则Class
是类文本()V
- 如果
是枚举类型(),则T
是枚举常量()V
不是V
null
- 如果
null
的最后一个项目符号可能看起来是任意的,但即使没有该项目符号,null
也不是合法值,因为它既不是常量表达式,也不是类文字,也不是枚举常量
因此,最后一点只是明确表示这不是一项疏忽
当注释被添加到语言中时,编译时常量的定义已经存在,包括存储它们的字节码格式。类文字也是语法定义的,但与常量不一样。但随着时间的推移,它们的字节码格式变得与同一版本中的其他常量相同。因此,对类文本的支持对于注释来说也是很自然的
唯一为注释支持而添加的功能是对枚举常量的引用和数组的存储格式。它们都立即证明了它们的有用性,因为注释定义本身所需的内置注释,@Retention
和Target
,都使用枚举常量,后者也使用数组
因此,null
未从法律构造集中删除,它从未被添加。考虑到的用例既不直接也不自然地包含,也不立即需要
显示类型注释建议(另请参见)最初考虑了添加对
null
的支持的建议,此时命名了反对意见。我们都知道,类型注释是用Java8引入的,而对null
的支持则不是(其他建议,如可重复注释,将其引入到语言中)。我觉得它是任意的。这就是我问的原因。限制很明确:。。。而且(对我来说)…这是有意义的,因为使用了default
/想要克服一些空值,不是吗?。而且<代码>对象foo()已经具有与您希望使用Object foo()default null实现的效果相同的效果代码>…从注释中忽略时为“null”!?;)感谢你对这个问题的广泛回答,以及所有的背景和链接。当我问这个问题时,这就是我想要的。你的回答表明这个决定不是武断的。