我天真地试图做一个简单的问题:
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:声明似乎不是有效的程序元素。这是相当混乱的 - 我认为语句类似于所有编程元素的超类型。
是否存在限制有效元素的理论或技术原因?
可能会以不同的方式完成 - 也就是说我可以用我自己的班级取代ElementType
并掌握涟漪变化,我可以诠释任何陈述吗?
答案 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
枚举值一致的声明类型。