java - 为什么不能在 Java 中对所有语句都进行注释?

标签 java annotations element

我在尝试这样做时天真地遇到了一个简单的问题:

public void someMethod(){    
  int x = 0;
  ...
  @SuppressWarnings({"rawtypes", "unchecked"})
  x = ((Comparable)lhs).compareTo(rhs);
  ...
}

这是非法的,必须改写才能编译:

public void someMethod(){  
  ...  
  @SuppressWarnings({"rawtypes", "unchecked"})
  int x = ((Comparable)lhs).compareTo(rhs);
  ...
}

我已将问题追溯到 ElementType : 语句似乎不是有效的程序元素。这相当令人困惑——我认为语句类似于所有编程元素的父类(super class)型。

  1. 限制有效元素是否存在理论或技术原因?

  2. 是否可以采用不同的方式 - 即假设我可以用我自己的类替换 ElementType 并掌握涟漪变化,我可以注释任何语句吗?

最佳答案

如果你看the Javadoc for @SuppressWarnings你会看到答案:它声明的目标是

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

换句话说,它不能合法地应用于语句。但是,它可以应用于变量声明。它与语句是否为程序元素无关;这基本上是因为此注释仅适用于事物的声明。

此外,如果您查看 the Javadoc for the enumeration that describes things that can have annotations,语句和表达式不在选项之列。通常,注释可以应用于事物的声明,而不是代码。

这样做的理论原因只是注释存储为类文件中声明的各个项目的属性。陈述不合格;当你的代码被编译时,语句已经不复存在了。只有一个字节码流,它来自的语句的唯一提示是(可选的)行号表。为了解决这个问题,他们需要向类文件添加一个新属性以引用各个字节码,如 this proposal, 中所示。并处理由此产生的许多复杂问题。

关于java - 为什么不能在 Java 中对所有语句都进行注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10981295/

相关文章:

java - 不同包中的 FXML 和 Controller - Button onAction 问题

在环境变量中添加路径字段时未设置java路径

java - Android Studio 错误 : Not annotated parameter overrides @NonNull parameter 的含义

java - 使用 java MethodHandles 实现鸭子类型(duck typing)

python - Numpy ValueError : setting an array element with a sequence. 此消息可能会在不存在序列的情况下出现?

java - 我们如何处理 java 流中的异常

java - 如果从 OSX 应用程序包运行,ProcessBuilder 无法找到文件

java - 可以阻止将属性转换为 xml 字符串的 xml 注释

java - 如何在不使用任何其他数据结构的情况下计算数组中的唯一元素JAVA

javascript - AngularJS 指令 - 设置多个指令元素的顺序(不是指令的优先级,而是元素的优先级)