为什么不能用Java注释所有语句?

时间:2012-06-11 13:41:58

标签: 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:声明似乎不是有效的程序元素。这是相当混乱的 - 我认为语句类似于所有编程元素的超类型。

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

  2. 可能会以不同的方式完成 - 也就是说我可以用我自己的班级取代ElementType并掌握涟漪变化,我可以诠释任何陈述吗?

4 个答案:

答案 0 :(得分:11)

如果你看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,中所述,并处理由此产生的许多复杂性。

答案 1 :(得分:5)

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

  

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

     

这会使注释语法变得非常复杂:我们必须牺牲简单性来说注释只是修饰符,可以在声明上使用。

换句话说,因为工作太多了: - )

答案 2 :(得分:3)

has been proposed作为JSR-308的一部分,允许对语句进行注释,但目前它不受支持,也不会成为下一个Java语言版本(即Java 8)的一部分。

我想当时注释已添加到语言中,主要目标类和方法级别信息主要围绕运行时用例(例如Java EE,JPA,JAX-WS等)制作,而语句级别注释在编译时主要有用(参见上面的wiki用例列表链接)。

答案 3 :(得分:2)

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

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