チェックされていないキャストの意味(別のタイプのキャストから別のキャストへのキャスト)を理解していると思いますが、キャストを「チェック」するとはどういう意味ですか?Eclipse でこの警告を回避できるようにキャストを確認するにはどうすればよいですか?
3 に答える
ピーターが書いたことを詳しく説明すると、次のようになります。
非ジェネリック型からジェネリック型へのキャストは、コンパイル時にジェネリック パラメータが消去されるため、実行時に問題なく動作する可能性があります。したがって、正当なキャストが残されます。ClassCastException
ただし、型パラメーターに関する誤った仮定が原因で、後でコードが予期しないエラーで失敗する可能性があります。例えば:
List l1 = new ArrayList();
l1.add(33);
List<String> l2 = (List<String>) l1;
String s = l2.get(0);
行 3 の unchecked 警告は、後で予期しない ClassCastException が発生する可能性があるという意味で、コンパイラが型の安全性を保証できないことを示しています。実際、これは暗黙のキャストを実行する 4 行目で発生します。
チェックされていないキャストとは、(暗黙的または明示的に) ジェネリック型から非修飾型に、またはその逆にキャストしていることを意味します。たとえば、この行
Set<String> set = new HashSet();
このような警告が表示されます。
通常、このような警告には正当な理由があるため、警告を抑制するのではなく、コードの改善を試みる必要があります。効果的な Java、第 2 版からの引用:
未チェックの警告をできる限り排除します。すべての警告を排除すると、コードが型安全であることが保証されます。これは非常に良いことです。これは、実行時にエラーが発生しないことを意味し
ClassCastException
、プログラムが意図したとおりに動作しているという確信が高まります。警告を取り除くことができず、警告を引き起こしたコードがタイプセーフであることを証明できる場合は、(その場合にのみ)
@SuppressWarnings("unchecked")
注釈を付けて警告を抑制します。コードがタイプセーフであることを最初に証明せずに警告を抑制した場合、誤った安心感を与えるだけです。コードは警告を発行せずにコンパイルされる場合がありますがClassCastException
、実行時にスローされる可能性があります。ただし、安全であることがわかっているチェックされていない警告を (抑制するのではなく) 無視すると、本当の問題を表す新しい警告が表示されても気付かないでしょう。新しい警告は、あなたが黙らせなかったすべての誤った警報の中で失われます。
もちろん、上記のコードのように警告を排除するのは必ずしも簡単ではありません。ただし、コードを見なければ、安全にする方法を知る方法はありません。