2013-07-23 71 views
1

是否可以在java中將ConcurrentHashMap轉換爲HashMap將ConcurrentHashMap轉換爲HashMap

這是我從ConcurrentHashMap轉換爲HashMap但我收到以下異常我的示例程序:

異常在線程「主要」 java.lang.ClassCastException: java.util.concurrent中。 ConcurrentHashMap中不能com.Hi.main被轉換爲java.util.HashMap中 (Hi.java:18)

我的代碼:

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")); 

    } 

} 

回答

3

ConcurrentHashMap和HashMap是兄弟姐妹,不是父子關係。因此演員失敗。

1

ConcurrentHashMap仍然是一個Map。所以,你可以創建一個新TreeMap的是這樣的:

ConcurrentHashMap myMap; 
... 
TreeMap myTreeMap = new TreeMap(myMap); 
10
Map<String, String> hashMap = new HashMap<String, String>(conpage); 

ConcurrentMap(如ConcurrentHashMap)具有與任何AbstractMap沒有關係,例如具有HashMap,因此該解決方案是創造一個新的HashMap在創建對象期間添加來自ConcurrentHashMap的所有值。

希望這會有所幫助。

1

您可以通過以下方式做到這一點 -

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

JavaDoc

通常,Java Collection API中的每個具體類型(如HashMap,ArrayList等)都具有一個構造函數,該構造函數接受其父級(如Map,List)的引用並從中構造一個新對象。

關於您遇到的異常,這是因爲ConcurrentHashMap不是HashMap的子類型/超類型,因此您得到ClassCastException。然而,這一切都工作得很好 - 型鑄造這樣

Map<String, String> hm = (Map<String, String>) conpage; 
3

使用putAll()方法istead:

HashMap hm=new HashMap<String, String>(); 
hm.putAll(conpage);  
1

居然有HashMap和ConcurrentHashMap中之間不存在繼承關係,這就是爲什麼你在施放了一個ConcurrentHashMap對象hashmap給它的ClassCastException。

1

是在以前的評論中的解釋更加明確:考慮你有三類:

class Position { 
} 

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

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

你不能做以下CAST(注意,投不轉換:這只是一個重新聲明類型)

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將是不安全的,因爲你不會知道發生了什麼:既然你知道該字段爲「銀」被初始化爲價值「只等明年!」如果Java是一種安全的語言,它不會允許這種類型的錯誤(實際上它是Java的幫助,它會拋出異常,因爲您認爲類型是別的東西)。

你期望的行爲是相當適合腳本的行爲。