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