17

Map をハッシュ Map に安全にキャストするにはどうすればよいですか?

クラスキャスト例外を回避したい

HashMap<String, String> hMap;

public void setHashMap(Map map){
    hMap = (HashMap<String, String>) map;
}
4

6 に答える 6

39

(浅い)コピーを作成できます:

HashMap<String, String> copy = new HashMap<String, String>(map);

または、まだ HashMap でない場合はキャストします。

HashMap<String, String> hashMap = 
   (map instanceof HashMap) 
      ? (HashMap) map 
      : new HashMap<String, String>(map);
于 2012-12-18T01:12:14.177 に答える
4

一般に、クラスキャスト例外のリスクなしに aMapを a に型キャストすることはできません。が a のHashMap場合、キャストは失敗します (失敗する必要があります)。MapTreeMap

キャストする前に使用して型をチェックすることで例外を回避できinstanceofますが、テストで「HashMap ではない」と表示された場合はスタックします。キャストを機能させることはできません。

実際の解決策は次のとおりです。

  • として宣言hMapMapHashMap
  • Mapエントリを新しく作成した にコピーするHashMapか、
  • (yuck) 実際のマップをラップするカスタム HashMap サブクラスを作成します。

(これらのアプローチはどれもすべての場合に機能するわけではありません...しかし、マップの使用目的の詳細がなければ、具体的な推奨事項を作成することはできません。)


その間、問題のあるライブラリのプロバイダにバグ レポートを提出するのが適切かもしれません。特定の Map 実装を使用することを強制することは、(一見すると) 悪い考えです。

于 2012-12-18T01:22:48.107 に答える
3

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);
    }
}
于 2012-12-18T01:21:00.237 に答える
1

HashMap にキャストしないでください。マップにキャスト!
質問の理由が本当にある場合は、Map が Map のインスタンスでない場合に備えて、新しい HashMap を作成する必要があります。
しかし、これは悪い考えです。

于 2012-12-18T01:17:44.657 に答える
0

できるよ:

if (map instanceof HashMap) {
   hMap = (HashMap<String, String>) map;
} else {
  //do whatever you want instead of throwing an exception
}

または、キャストを try/catch で囲み、例外が発生したときに例外をキャプチャします。

于 2012-12-18T01:13:21.017 に答える
0

であると常に想定する場合は、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

于 2012-12-18T01:22:41.877 に答える