7

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

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:语句似乎不是有效的程序元素。这相当令人困惑 - 我认为语句类似于所有编程元素的超类型。

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

  2. 能否以不同的方式完成 - 即假设我可以ElementType用我自己的班级取代并掌握涟漪变化,我可以注释任何陈述吗?

4

4 回答 4

12

如果您查看Javadoc,@SuppressWarnings您会看到答案:它声明的目标是

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

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

此外,如果您查看Javadoc 中描述可以具有注释的事物的枚举,则语句和表达式不在选择之列。一般来说,注释可以应用于事物的声明,而不是代码。

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

于 2012-06-11T13:48:03.273 回答
5

我知道答案已经被接受,只是把它扔在那里。这是JSR-175的常见问题解答的摘录,它最初为 Java 添加了注释:

为什么不能注释任意程序元素,例如块和单个语句?

这将使注解语法大大复杂化:我们将不得不牺牲说注解只是修饰符的简单性,它可​​以用于声明。

换句话说,因为工作量太大:-)

于 2012-06-11T14:26:36.070 回答
3

已被提议作为JSR-308的一部分以允许对语句进行注释,但目前它不受支持并且不会成为下一个 Java 语言版本(即 Java 8)的一部分。

我猜在语言中添加注释时,主要的目标类和方法级信息主要围绕运行时用例(例如 Java EE、JPA、JAX-WS 等)制作,而语句级注释主要是在编译时有用(请参阅上面的 wiki 链接以获取用例列表)。

于 2012-06-11T13:53:34.603 回答
2

Java 中的声明是具有标识符并且可以从程序的其他部分引用的实体。声明不符合该标准 - 它是一个可能导致将值分配给某个声明的实体的操作。

Java 规范 ( http://docs.oracle.com/javase/specs/jls/se5.0/html/names.html#6.1 )的第 6.1 节列出了与ElementType枚举值一致的声明类型。

于 2012-06-11T13:51:10.050 回答