注释属性必须是类文字吗?为什么?常量也应该没问题

2024-01-06

有人可以解释为什么字符串和类注释参数的预期不同吗?为什么编译器需要类的文字,同时也接受字符串的常量?

使用 Spring 的 @RequestMapping 的工作示例:

public class MyController {
    public static final String REQUEST_MAPPING = "/index.html";
    @RequestMapping(MyController.REQUEST_MAPPING) // ALL OK!
    ...
}

TestNG 的 @Test 的 WTF 示例:

public class MyControllerTest {
    public static final Class TEST_EXCEPTION = RuntimeException.class;
    @Test(expectedExceptions = MyControllerTest.TEST_EXCEPTION) // compilation error, WTF:
    // The value for annotation attribute Test.expectedExceptions must be a class literal
    ...
}

当然有效的是 @Test(expectedExceptions = RuntimeException.class)。但为什么?我看到的注释参数的唯一区别是它的类型:String 与 Class。为什么 Java 编译器也接受 String 常量,但只接受类文字?


Java 语言规范不允许您将编译时常量与类型参数一起使用Class。您只能使用类文字。

The JLS http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7关于注释的合适参数值有以下说法:

元素类型T与元素值相称V当且仅当以下条件之一为真:

  • T is an array type E[] and either:
    • V is an 元素值数组初始化器和每个元素值初始化器(类似于数组初始值设定项中的变量初始值设定项)V相当于E. Or
    • V is an 元素值相当于T.
  • The type of V is assignment compatible (§5.2 http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#184206) with T and, furthermore:
    • If T是原始类型或字符串,V是一个常量表达式(§15.28) http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313.
    • V不为空。
    • if T是 Class,或者 Class 的调用,V 是类文字(§15.8.2) http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#251530.
    • If T是一个枚举类型,并且V是一个枚举常量。

如果元素类型与元素类型不相称,则会出现编译时错误元素值.

不过,我无法解释为什么 JLS 中有此限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注释属性必须是类文字吗?为什么?常量也应该没问题 的相关文章

随机推荐

  • 错误请求时返回 Json

    因此 OK value 返回带有 application json 标头的格式化 json 然而 BadRequest 却没有 如果请求是 application json 即使这是一个错误的请求 响应也不应该像这样吗 HttpPost p
  • 为什么 C++ 程序会为局部变量分配比最坏情况下需要的内存更多的内存?

    灵感来自这个问题 https stackoverflow com q 7089035 57428 显然在下面的代码中 include
  • 计算并返回列表中的平均值

    我有一个很长的清单 其中包含一些值 我想定义一个函数 它获取列表并计算列表中每 24 个值的平均值 并将平均值作为列表返回 我该怎么做呢 我的列表中有 8760 个元素 返回的列表应该给出 8760 24 365 个元素 hourly te
  • Django REST Framework:如果相关字段不存在,则在 POST 上返回 404(而不是 400)?

    我正在开发一个 REST API 它从一些无法修补或其他任何东西的真正脑死亡的软件中获取 POST 请求 POST 用于更新数据库中已存在的模型对象 具体来说 我正在发布具有相关字段 SlugRelatedField 因为 POSTer 知
  • C++ 在给定用户输入整数的情况下打印空格或制表符

    我需要将用户输入 数字 转换为 TAB 空格的输出 例如我询问用户 cout lt lt Enter amount of spaces you would like integer lt lt endl cin gt gt n n 我需要将
  • 检查某个单词是否在 Python 列表中

    我是学习Python的初学者 并且已经进行了相当多的练习 但是我在编写我想编写的某些代码时遇到了困难 本质上 我想编写一个代码来分析每个列表中的单词 以检查单词 deer 是否确实在哺乳动物列表中并打印特定消息 这是我的尝试 myMamma
  • 使用 UIPinchGestureRecognizer 绘制线条

    我想使用 UIPinchGeustureRecognizer 画线 我已经尝试了所有 stackoverflow 解决方案 但没有运气 请帮我解决这个问题 我收到以下错误 首先我想知道我的代码逻辑是否正确 并且我没有从触摸开始 触摸移动中得
  • 为什么我的简单 pygame 会滞后? [复制]

    这个问题在这里已经有答案了 我一直在使用 pygame 制作一个简单的 python 游戏 在添加切换枪支的功能后 游戏开始滞后 我不知道为什么它滞后 我尝试过重新启动 但没有成功 该代码非常短 所以可能只是我的电脑 但如果有任何可以帮助运
  • UI 滚动时应用程序停止从套接字接收数据

    我有一个使用 UDP 套接字接收数据的 iPad 应用程序 并且它有一个UIWebView来浏览网页 但是在 UIWebView 中进行滚动时 一切都会冻结并且没有收到任何数据 我一直在搜索 它与运行循环和线程有关 但是 如果 UIWebV
  • C# 多线程控制台应用程序 - 控制台在线程完成之前退出

    我有一个 C 控制台应用程序 最多可创建 5 个线程 线程执行良好 但 UI 线程在完成工作后关闭 有没有办法让主 UI 线程在副线程运行时保持运行 foreach var url in urls Console WriteLine sta
  • Google Apps 自定义域 SSL 已配置但连接失败

    我已按照以下步骤操作https cloud google com appengine docs ssl https cloud google com appengine docs ssl and https support google c
  • 不同浏览器窗口中的 JSF 会话问题

    我们有一个基于 JSF 2 0 MyFaces 构建并在 Weblogic 应用服务器上运行的应用程序 我们面临一个有关 http 会话的问题 Issue 假设我在两个不同的 IE 窗口中打开应用程序 并在第一个窗口中提供一些搜索输入 在第
  • R:考虑因素按周计算移动最大坡度

    我有一个数据框 其中包括下面的供暖度日 HDD structure list WinterID structure c 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L
  • mysql 分区

    只是想验证数据库分区仅在数据库级别实现 当我们查询分区表时 我们仍然执行正常查询 我们的查询没有什么特别的 解析查询时会自动执行优化 对吗 例如我们有一个名为 地址 的表 其中有一列名为 国家 地区代码 和 城市 所以如果我想获得美国纽约的
  • 如何创建 RSS 提要并显示它?

    在我为广播电台维护的网站上 他们有一个显示新闻文章的页面 现在新闻发布在一个 html 页面中 然后由包含所有导航的 php 页面读取 我被要求将其制作成 RSS 源 我该怎么做呢 我知道如何制作 XML 文件 但编辑新闻文件的人缺乏技术
  • 避免在 Android 上尝试/捕获

    我是 Android 环境的新手 我已经开始编写一些代码来对数据库执行一些查询 当我必须处理异常时 我不知道正确的方法是什么 我曾经使用过 Androidthrows方法声明 但似乎throws安卓不允许吗 只是try catch 我这样说
  • 使用 VBA 以编程方式安装 Microsoft Access 加载项

    查找有关 Microsoft Access 加载项开发的信息就像拔掉所有牙齿一样 是的 我发现了几篇托管加载项文章 但几乎找不到非托管加载项的内容 我确实找到了一篇很棒的文章 它在创建基本上是一个非托管的 mda 项目方面非常古老 我已经遵
  • PIP 在 Windows 8 上的哪里存储/保存 Python 3 模块/包?

    我到处都找过了 但找不到软件包的安装位置 此外 包裹是来自pip questions tagged pip 模块 库或只是包python questions tagged python术语 使用此命令列出全局包及其位置 pip list v
  • Gradle 获得“sudo”权限

    我有下一个问题 我需要使用 Gradle 在服务器上执行一些部署内容 但为此 Gradle 应该在目标部署服务器上具有 root 访问权限 我有 sudo 的密码 但我不知道如何将其插入服务器 有没有办法从 Gradle 任务中获得 sud
  • 注释属性必须是类文字吗?为什么?常量也应该没问题

    有人可以解释为什么字符串和类注释参数的预期不同吗 为什么编译器需要类的文字 同时也接受字符串的常量 使用 Spring 的 RequestMapping 的工作示例 public class MyController public stat