1. ホーム
  2. java

[解決済み] タイプの安全性。アンチェック・キャスト

2022-02-25 03:54:27

質問

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 というのも、この場合ジェネリックではこの現象をブロックできないからです。