Map をハッシュ Map に安全にキャストするにはどうすればよいですか?
クラスキャスト例外を回避したい
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) map;
}
Map をハッシュ Map に安全にキャストするにはどうすればよいですか?
クラスキャスト例外を回避したい
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) map;
}
(浅い)コピーを作成できます:
HashMap<String, String> copy = new HashMap<String, String>(map);
または、まだ HashMap でない場合はキャストします。
HashMap<String, String> hashMap =
(map instanceof HashMap)
? (HashMap) map
: new HashMap<String, String>(map);
一般に、クラスキャスト例外のリスクなしに aMap
を a に型キャストすることはできません。が a のHashMap
場合、キャストは失敗します (失敗する必要があります)。Map
TreeMap
キャストする前に使用して型をチェックすることで例外を回避できinstanceof
ますが、テストで「HashMap ではない」と表示された場合はスタックします。キャストを機能させることはできません。
実際の解決策は次のとおりです。
hMap
しMap
、HashMap
Map
エントリを新しく作成した にコピーするHashMap
か、(これらのアプローチはどれもすべての場合に機能するわけではありません...しかし、マップの使用目的の詳細がなければ、具体的な推奨事項を作成することはできません。)
その間、問題のあるライブラリのプロバイダにバグ レポートを提出するのが適切かもしれません。特定の Map 実装を使用することを強制することは、(一見すると) 悪い考えです。
ClassCastException
またはなどのあらゆる種類の例外を回避するために、関数は次のようにする必要がありますNullPointerException
。ここでは、あらゆる種類のオブジェクトがクラスのフィールドにMap
割り当てられます。HashMap
public void setHashMap(Map<String, String> map) {
if (map != null && map instanceof HashMap<?, ?>) {
hMap = (HashMap<String, String>) map;
} else if (map != null) {
hMap.putAll(map);
}
}
HashMap にキャストしないでください。マップにキャスト!
質問の理由が本当にある場合は、Map が Map のインスタンスでない場合に備えて、新しい HashMap を作成する必要があります。
しかし、これは悪い考えです。
できるよ:
if (map instanceof HashMap) {
hMap = (HashMap<String, String>) map;
} else {
//do whatever you want instead of throwing an exception
}
または、キャストを try/catch で囲み、例外が発生したときに例外をキャプチャします。
であると常に想定する場合は、HashMap<String, String>
これを実行してみませんか?
HashMap<String, String> hMap;
public void setHashMap(HashMap<String, String> map){
hMap = map;
}
any を受け入れるより一般的なものが必要な場合Map
:
public void setHashMap(Map<String, String> map){
if (map != null)
hMap = new HashMap<String, String>(map);
else
hMap = new HashMap<String, String>();
}
キャストは不要です。また、あなたの例には戻り値の型がありませんでした。を入れるつもりだったと思いますvoid
。