mmi*_*ldt 3 java null annotations default-value
根据Annotation default "null" value,在注解中禁止空值作为默认值。我想知道为什么。这是什么原因?
请注意,null不仅不支持的为默认值,它是不支持的注释值一般。
JLS §9.7.1规定:
如果元素类型与元素值不相称,则会出现编译时错误。当且仅当以下条件之一为真时,元素类型才
T与元素值相称V:
T是一个数组类型E[],并且:
如果
V是ConditionalExpression或Annotation,则对应V于E; 或者如果
V是ElementValueArrayInitializer,则V包含的每个元素值都与 相称E。一个ElementValueArrayInitializer是类似于正常数组初始化(第10.6节),不同之处在于ElementValueArrayInitializer可能语法包含注解以及表达式和嵌套的初始值设定。但是,嵌套初始化器在ElementValueArrayInitializer 中在语义上不合法,因为它们永远不会与注释类型声明中的数组类型元素相称(不允许嵌套数组类型)。
T不是数组类型,并且 的类型与V赋值兼容(第5.2 节)T,并且:
最后一个项目符号禁止null可能看起来很随意,但即使没有那个项目符号,null也不是合法值,因为它既不是常量表达式,也不是类文字,也不是枚举常量。
所以最后一个要点只是明确表示这不是疏忽。
当注释被添加到语言中时,编译时常量的定义已经存在,包括存储它们的字节码格式。类文字也在语法上进行了定义,尽管与常量不同。但是对于JDK-4662563,它们的字节码格式变得等同于同一版本中其他常量的字节码格式。因此,对类文字的支持对于注释来说也是很自然的。
唯一为注释支持添加的功能是对枚举常量的引用和数组的存储格式。两者都立即证明了它们作为注释定义本身所需的内置注释的有用性,@Retention并且Target, 都使用枚举常量,后者也使用数组。
所以,null没有从法律结构中删除,它从未被添加。对于考虑过的用例,既不直接也不自然地包含也不立即需要。
此答案表明,null最初已考虑为类型注释提案添加支持的建议(另请参阅存档链接),此时提出了反对意见。众所周知,Java 8 引入了类型注解,不支持null(其他建议,如可重复注解,已纳入语言)。