2011-09-12 7 views
26

私は理解できない奇妙な振る舞いに遭遇しました。ジェネリックの@SuppressWarnings( "unchecked")を1行に追加すると、コンパイラエラーが発生する

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

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つの方法の違いは何ですか?

答えて

41

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

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

ので、ここでやってをしようとコンパイラは(つまり、メソッド本体内部に注釈をたどることができる唯一のことだとして)タイプとしてreturnValueを解釈することで、失敗したものを。

の宣言returnValueの場合は、この場合は役に立ちません。ただし、新しいローカル変数を作成して、イニシャライザでキャストを実行し、注釈を付けることができます。 Eclipseで_

@SuppressWarnings("unchecked") 
T string = (T) collection.getString(attrName); 
returnValue = string; 
+0

は、ここに来た私は、エラー_理解していなかったので、「トークン 『結果』に構文エラーを、VariableDeclaratorIdはこのトークンの後に予想されます」。コンパイラが何をしようとしているのか、それがなぜ失敗するのか、あなたの説明は素晴らしいです!他の誰かがこの構文エラーを検索した場合に、このコメントを追加するだけです。 – user1438038

関連する問題