当前位置: 首页 > 面试题库 >

为什么批注属性的值应为常量表达式?

公羊兴文
2023-03-14
问题内容

我有以下代码

 @UIUnitTimeout(8*60*1000) // works
 @UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work

我知道根据JLS,只允许将常量表达式作为批注属性的值。但为什么?如果数据类型匹配,为什么还不够?如果要在运行时对表达式进行求值,是否有可能出错?每个规范背后都有逻辑推理吗?


问题答案:

注释就像类型扩展或有关该类型的元数据。

因为Java是一种静态类型的语言(意味着类型在编译时是已知的),所以在编译时也知道注释属性数据(元数据)似乎是合理的-
您正在定义/声明有关注释(扩展)的数据。

从纯粹的实践出发,对于注释处理(这是一个编译时(可选)步骤),
必须 在编译时知道属性数据-您尚未到达运行时环境,但仍需要该属性数据。



 类似资料:
  • 在以下代码中(在本地和Wandbox上测试): MSVC 15.8.5编译失败: (全部指包含的行) Clang 8(HEAD)报告: gcc 9(负责人)报告: 为什么? 首先,它们显然都认为enum-id是非常数,尽管它们显然实际上是众所周知的编译时常数值。 其次,MSVC抱怨读取超出生存期,但的生存期及其值应在中的整个使用过程中延长。 第三,gcc有一个奇怪的const-vs非const抱怨

  • 问题内容: Eclipse不断给我错误: 但是我绝对可以给注解一个常量。 如果我将其更改为 很高兴,但我不必这样做。有谁知道为什么我的MIN_YEAR常量使用评估表达式而不是纯数字声明时不被视为常量? 问题答案: 表达方式 将仅在运行时确定,但是 是在编译时确定的,因此允许使用,因为注释中的值应在编译时而不是运行时解析。

  • 我正在运行一个java RMI的Hello World示例 1)我在一个空文件夹中运行注册表 2)我启动HTTP服务器在运行时检索类。下载文件夹包含客户端-服务器的远程接口 3)我启动服务器,按照java RMI教程中的建议传递java.rmi.server.codebase属性 RMI注册表未联系HTTP服务器,正在引发异常(请参阅问题后的详细信息)。但是如果我做了下面的事情 1) 用java启

  • 问题内容: 我在代码中使用注释,并且尝试使用在运行时确定的值。 我将列表定义为(lst),并将一些元素添加到此列表中。 使用时,出现编译错误: 这个问题有什么解决方案? 问题答案: 注释的值必须是一个编译时间常数,因此没有简单的方法可以完成您想做的事情。 另请参见此处:如何通过Constantjava为注释提供值 如果在尝试运行程序之前知道该值,则可以使用一些编译时工具(ant,maven?)进行

  • PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?

  • C 14中的§5.19/3定义了积分常量表达式和转换常量表达式: 整数常量表达式是整数或无作用域枚举类型的表达式,隐式转换为prvalue,其中转换的表达式是核心常量表达式。[注意:此类表达式可用作数组边界(8.3.4, 5.3.4),作为位字段长度(9.6),如果基础类型不固定,则可用作枚举器初始化器(7.2),并用作对齐(7.6.2)。-结束注释]类型的转换常量表达式是一个表达式,隐式转换为类