0

次のように、ジェネリック型をインスタンス化するためのスニペット コードがあります。

public class GenericMessageMapper<I ,X>
{
   public X xFromI(I imf)
   {
      // do thing by imf argument
      Class<X> clazz = (Class<X>)((ParameterizedType)
                                   this.getClass()
                                       .getGenericSuperclass())
                                       .getActualTypeArguments()[1];
      X x = clazz.newInstance(); 
   }
}

上記のコードは正常に機能しましたが、次のメッセージによってコードに警告が表示されます (変数行MyEclipseの準備に関する黄色の下線):clazzType safety: Unchecked cast from Type to Class<X>

xFromI上記のメソッドに次の注釈を一時的に追加します。

@SuppressWarnings("unchecked")

この警告の理由と解決策は何ですか?

4

3 に答える 3

2

警告はそれだけです。警告。警告が無関係な場合もあれば、そうでない場合もあります。これらは、コンパイラーが問題である可能性があると考えるものに注意を喚起するために使用されますが、そうではない場合があります。

キャストの場合、この場合は常に警告が表示されます。特定のキャストが安全であることが絶対に確信できる場合は、行の直前に次のような注釈を追加することを検討する必要があります。

@SuppressWarnings (value="unchecked")

型安全性を参照してください:チェックされていないキャスト

于 2012-07-04T07:36:10.213 に答える
1

これは、クラスの型が実行時にのみ知られていることを意味するだけなので、型 X のクラスを取得することになっていると思われる状況が発生する可能性がありますが、実際には別の型です (コンパイル時に認識されません)。 X は任意の型である可能性があるため)。

基本的に、この警告は無視できます。

于 2012-07-04T07:34:15.833 に答える
1

ftom2instanceofは正しいです。通常、この警告が発生した場合は、キャストの前にインスタンス チェック () を実行する必要があります。しかし、あなたの場合、Javaのジェネリックは消去によって実装されているため、これは不可能です。Class<X>は具体化された型ではないため、チェックなどに使用することはできず、警告をオフにする唯一の方法は を使用すること@SuppressWarnings(value = "unchecked")です。ジェネリックの詳細については、この本を使用できます。

于 2012-07-04T07:56:30.883 に答える