web-dev-qa-db-ja.com

ジェネリックスの@SuppressWarnings( "unchecked")を1行に追加すると、Eclipseコンパイラエラーが生成されます

私は理解できない奇妙な行動に出くわしました。

文字列をジェネリックにキャストする必要があり、警告が表示されます。

_Type safety : Unchecked cast from String to T
_
  • メソッド宣言の上に@SuppressWarnings("unchecked")を追加すると、正常に機能します。

  • 割り当ての上に追加すると、Eclipseでコンパイラエラーが発生します。

これは正常に機能します。

_@SuppressWarnings("unchecked")
public <T> T search(final String query){
 T returnValue = null;
 ...
 if(returnValue instanceof String){
  returnValue = (T) collection.getString(attrName);
 }
_

これはうまくいきません。

_public <T> T search(final String query){
 T returnValue = null;
 ...
 if(returnValue instanceof String){
  @SuppressWarnings("unchecked") // Compiler error: "returnValue cannot be resolved to a type"
  returnValue = (T) collection.getString(attrName);
 }
_

警告を抑制する2つの方法の間に矛盾を引き起こしている原因は何ですか?

32
Farmor

任意の式に注釈を付けることはできません(まだ?後で追加されるかもしれません)。

canただし、ローカル変数宣言に注釈があります。

したがって、コンパイラーtriesがここで行うことは、returnValueを型として解釈することであり(メソッド本体内の注釈に従うことができるのはそれだけであるため)、失敗します。

この場合、returnValueの-​​declarationにアノテーションを配置しても役に立ちません。ただし、初期化子でキャストを実行し、それに注釈を付ける新しいローカル変数を作成できます。

@SuppressWarnings("unchecked")
T string = (T) collection.getString(attrName);
returnValue = string;
51
Joachim Sauer