[解決済み] チェックされていないキャストの警告に対処するにはどうすればよいですか?
質問
Eclipseで以下のような警告が表示されます。
型安全です。ObjectからHashMapへのキャストがチェックされていません。
これは、私がコントロールできない、Objectを返すAPIへの呼び出しによるものです。
HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
return theHash;
}
Eclipseの警告は、理論的には少なくともコードの問題の可能性を示しているので、できれば避けたいのです。 でも、これをなくすいい方法はまだ見つかっていないんだ。 私は、関係する一行をそれ自体でメソッドに抽出し、そのメソッドに
@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.
解決方法は?
うわー;自分の質問の答えがわかった気がする。 ただ、その価値があるのかどうか!?:)
問題は、キャストがチェックされていないことです。 だから、自分でチェックする必要があるんだ。 パラメータ化された型の情報はコンパイル時に消されてしまっているので、実行時に利用できないからです。
しかし、ハッシュの各項目に対してinstanceofによるチェックを行うことで、型安全な新しいハッシュを構築することができるのです。 そうすれば、型安全な新しいハッシュを構築することができる。そして、警告を引き起こすこともない。
mmyersとEsko Luontolaのおかげで、もともとここに書いたコードをパラメータ化したので、どこかのユーティリティクラスでラップして、パラメータ化した任意のHashMapに使用することができます。 もし、あなたがジェネリックにあまり詳しくないのであれば、この回答の編集履歴を見ることをお勧めします。
public static <K, V> HashMap<K, V> castHash(HashMap input,
Class<K> keyClass,
Class<V> valueClass) {
HashMap<K, V> output = new HashMap<K, V>();
if (input == null)
return output;
for (Object key: input.keySet().toArray()) {
if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {
Object value = input.get(key);
if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {
K k = keyClass.cast(key);
V v = valueClass.cast(value);
output.put(k, v);
} else {
throw new AssertionError(
"Cannot cast to HashMap<"+ keyClass.getSimpleName()
+", "+ valueClass.getSimpleName() +">"
+", value "+ value +" is not a "+ valueClass.getSimpleName()
);
}
} else {
throw new AssertionError(
"Cannot cast to HashMap<"+ keyClass.getSimpleName()
+", "+ valueClass.getSimpleName() +">"
+", key "+ key +" is not a " + keyClass.getSimpleName()
);
}
}
return output;
}
それは大変な作業で、おそらく報酬はほとんどないでしょう......。 使うかどうか迷っています。 使うかどうか迷うところですが、使う価値があるかどうか、ご意見をいただければと思います。 また、改善提案もお願いします。AssertionErrorsを投げる以外に何か良い方法はないでしょうか? AssertionErrorsを投げる以外に何か良い方法はないでしょうか? チェックされたExceptionにした方がいいのでしょうか?
関連
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
jd-gui Java Exceptionが発生しました。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
SpringBootApplication を型解決できない。
-
Javaクラスローダーにソースコードから潜り込む
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
Javaエラーメッセージがenclosingクラスでない
-
javaでよく使われる英単語
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
ローカルリソースのロードが許可されていない場合の解決策