2

in javaに変換することは可能ConcurrentHashMapですか?HashMap

ConcurrentHashMapこれは、 から に変換していたサンプル プログラムですがHashMap、次の例外が発生していました。

スレッド「メイン」の例外 java.lang.ClassCastException: java.util.concurrent.ConcurrentHashMap は com.Hi.main(Hi.java:18) で java.util.HashMap にキャストできません

私のコード:

package com;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Hi {

    public static void main(String args[]) {

        Map<String, String> conpage = new ConcurrentHashMap<String, String>();

        conpage.put("1", "A");
        conpage.put("2", "B");
        conpage.put("3", "C");

        HashMap hm = (HashMap) conpage;

        System.out.println(hm.get("1"));

    }

}
4

8 に答える 8

12
Map<String, String> hashMap = new HashMap<String, String>(conpage);

( ConcurrentMaplike ) は anyとConcurrentHashMap関係がないため、解決策は、オブジェクトの作成中にすべての値を追加して新しい を作成することです。AbstractMapHashMapHashMapConcurrentHashMap

お役に立てれば。

于 2013-07-23T09:28:12.540 に答える
5

ConcurrentHashMapHashMapではないため、このキャストは実行できません。実装に関係なくMapとして扱います。

それでも、 Map#putAll()を使用できます。

推奨読書:

  1. Java - HashMap と Map オブジェクト
  2. 「インターフェイスにプログラムする」とはどういう意味ですか?
于 2013-07-23T09:27:55.127 に答える
3

次のような型キャストの代わりにputAll()メソッドを使用します。

HashMap hm=new HashMap<String, String>();
hm.putAll(conpage);    
于 2013-07-23T09:30:21.337 に答える
2

ConcurrentHashMap と HashMap は兄弟であり、親子関係はありません。したがって、キャストは失敗します。

于 2013-07-23T09:27:30.933 に答える
1

前のコメントの説明をより明確にするために、次の 3 つのクラスがあるとします。

class Position {
}

class One extends Position {
  String gold = "the best";
}

class Two extends Position {
  String silver = "just wait next year!";
}

次のキャストは実行できません (キャストは変換ではないことに注意してください: 型の再宣言のみです)。

void showPosition() {
  Position one = new One(); // this is regular since One extends Position
  Two two = (Two)one; // this is impossible because one is not a two
}

このキャストが可能な場合、次の問題をコンパイラにどのように処理してもらいたいですか? : 銀という分野は一つもありません: そう呼ぶ

((Two)one).silver

不可能です: 何が起こっているのか理解できないので、null を返すのは安全ではありません: フィールド 'silver' が値に初期化されていることがわかっているので、「来年待ってください!」

Java は安全な言語であるため、このタイプのエラーは許可されません (実際には、タイプが別のものであると考えているため、Java が例外をスローするのは Java の助けです)。

あなたが期待する動作は、むしろスクリプトに適した動作です。

于 2013-07-23T11:25:15.410 に答える
1

ConcurrentHashMap は依然として Map です。したがって、次のように新しい TreeMap を作成できます。

ConcurrentHashMap myMap;
...
TreeMap myTreeMap = new TreeMap( myMap );
于 2013-07-23T09:27:46.553 に答える