[解決済み] タイプの安全性。アンチェック・キャスト
質問
Springアプリケーションのコンテキストファイルに、次のようなものがあります。
<util:map id="someMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="java.lang.String">
<entry key="some_key" value="some value" />
<entry key="some_key_2" value="some value" />
</util:map>
javaクラスでは、次のような実装になっています。
private Map<String, String> someMap = new HashMap<String, String>();
someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
Eclipseでは、次のような警告が表示されます。
型安全です。ObjectからHashMapへのアンチェックされたキャスト<String,String>
何がいけなかったのか?
どうすればいいですか?
さて、まず、メモリを浪費しているのは、新しい
HashMap
の作成呼び出しです。2行目は、この作成されたハッシュマップへの参照を完全に無視し、ガベージコレクタが利用できるようにしています。だから、そんなことはしないで、使ってください。
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
次に、コンパイラは、オブジェクトを
HashMap
であるかどうかをチェックせずに
HashMap
. しかし、仮にそうであったとしても
if(getApplicationContext().getBean("someMap") instanceof HashMap) {
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
}
それでもおそらくこの警告は出るでしょう。問題は
getBean
が返す
Object
ということで、型が何であるかは不明です。これを
HashMap
を直接実行しても、2番目のケースの問題は発生しません(最初のケースでも警告は出ないかもしれませんが、JavaコンパイラがJava 5の警告に対してどれだけ杓子定規なのかはわかりません)。しかし、あなたはそれを
HashMap<String, String>
.
ハッシュマップは、キーとしてオブジェクトを取り、値としてオブジェクトを持つマップである。
HashMap<Object, Object>
ということになります。したがって、Beanを取得したときに、それが
HashMap<String, String>
を持つ可能性があるからです。
HashMap<Date, Calendar>
なぜなら、返される非属性表現は、任意のオブジェクトを持つことができるからです。
コードがコンパイルされ、実行できるようになれば
String value = map.get("thisString");
という警告が出ますが、特にエラーもなく、気にしないでください。しかし、もしマップが完全に文字列のキーと文字列の値で構成されていない場合は
ClassCastException
というのも、この場合ジェネリックではこの現象をブロックできないからです。
関連
-
[解決済み] 型の安全性。オブジェクトからのキャストがチェックされない
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] Java の条件付きコンパイル:コードチャンクをコンパイルしないようにするには?
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] チェックされていないキャストの警告に対処するにはどうすればよいですか?
-
[解決済み] JavaにおけるSuppressWarnings("unchecked")とは何ですか?
-
[解決済み] 値のペアのJavaコレクション?(タプル?)
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] JDBC タイプの方言マッピングがありません。1111
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] java.io.IOException。DER長の短い読み取り
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について
-
[解決済み] チェックされていないキャストの警告に対処するにはどうすればよいですか?