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

kos*_*tja 7 java annotations element

我天真地试图做一个简单的问题:

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

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

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

我已经将问题追溯到ElementType:一个语句似乎不是一个有效的程序元素.这是相当混乱的 - 我认为语句类似于所有编程元素的超类型.

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

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

Ern*_*ill 11

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

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您查看Javadoc以获取描述可以注释的内容的枚举,则语句和表达式不在其中.通常,注释可以应用于事物的声明,而不是代码.

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


Ale*_*lex 5

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

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

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

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