チェックされていないキャストの警告に対処するにはどうすればよいですか? 質問する

チェックされていないキャストの警告に対処するにはどうすればよいですか? 質問する

Eclipse から次のような警告が表示されます。

型の安全性: Object から HashMap へのチェックなしのキャスト

これは、オブジェクトを返す、制御できない API の呼び出しからのものです。

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
  HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
  return theHash;
}

可能であれば、Eclipse の警告は避けたいです。理論的には、少なくとも潜在的なコードの問題を示しているからです。しかし、この問題を排除する良い方法はまだ見つかっていません。関係する 1 行をメソッド自体に抽出し、@SuppressWarnings("unchecked")そのメソッドに追加することで、警告を無視するコード ブロックの影響を抑えることができます。もっと良い方法はありますか? Eclipse でこれらの警告をオフにしたくありません。

このコードにたどり着く前は、コードはよりシンプルでしたが、それでも警告が発生していました。

HashMap getItems(javax.servlet.http.HttpSession session) {
  HashMap theHash = (HashMap)session.getAttribute("attributeKey");
  return theHash;
}

問題は、ハッシュを使用しようとすると警告が表示される別の場所にあります。

HashMap items = getItems(session);
items.put("this", "that");

Type safety: The method put(Object, Object) belongs to the raw type HashMap.  References to generic type HashMap<K,V> should be parameterized.

ベストアンサー1

もちろん、明らかな答えは、チェックされていないキャストを行わないことです。

どうしても必要な場合は、少なくとも注釈の範囲を制限するようにしてください@SuppressWarningsJavadocsローカル変数に適用できます。この方法では、メソッド全体に影響が及ぶこともありません。

例:

@SuppressWarnings("unchecked")
Map<String, String> myMap = (Map<String, String>) deserializeMap();

Mapにジェネリック パラメータが本当に必要かどうかを判断する方法はありません<String, String>。 パラメータが何であるべきかを事前に知っておく必要があります (そうでない場合は、 を取得したときにわかりますClassCastException)。 が安全かどうかをコンパイラが知ることができないため、コードが警告を生成するのはこのためです。

おすすめ記事