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

私は答えがすでに受け入れられていることを知っています.これをそこに捨てるだけです. 以下は、もともと Java にアノテーションを追加したJSR-175の FAQ からの抜粋です。

ブロックや個々のステートメントなど、任意のプログラム要素に注釈を付けられないのはなぜですか?

これは、注釈の構文を非常に複雑にします。注釈は、宣言で使用できる単なる修飾子であるという単純さを犠牲にする必要があります。

言い換えれば、それは仕事が多すぎるからです:-)

于 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.1ElementType ) のセクション 6.1 には、列挙値と一致する宣言のタイプがリストされています。

于 2012-06-11T13:51:10.050 に答える