2012-12-18 287 views
6

如何安全地將哈希映射轉換爲哈希映射?安全地轉換爲哈希映射

我想避免類轉換異常

HashMap<String, String> hMap; 

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

爲什麼'setHashMap()'在真的需要'HashMap'時需要'Map'? –

+0

「安全」是什麼意思?無法施放時你想要發生什麼?是否可以接受副本? – Thilo

+0

我使用的外部庫是使用hashmap而不是常規接口來實現的...... :( – Stainedart

回答

17

如果你想一(淺)複製:

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

如果你只想做時,它是不是已經是一個HashMap :

HashMap<String, String> hashMap = 
    (map instanceof HashMap) 
     ? (HashMap) map 
     : new HashMap<String, String>(map); 
0

你可以這樣做:

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

或者只是用try/catch包圍轉換,並在發生異常時捕獲異常。

+0

假設當然''map'不是'HashMap ',因爲如果是,那麼只檢查'instanceof HashMap'將不起作用。任何像String s = map.get(「foo」)的調用'會拋出'ClassCastException'。 – Brian

0

你不應該投射到HashMap!投射到地圖!
如果您確實有問題的原因,那麼您必須創建一個新的HashMap,以防Map不是Map的一個實例。
但這是一個壞主意。

2

您的功能應該如下,以避免任何形式的異常,例如ClassCastExceptionNullPointerException。在這裏,任何種類的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); 
    } 
} 
0

如果你總是假設它是一個HashMap<String, String>,爲什麼不這樣做呢?

HashMap<String, String> hMap; 

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

如果你想要更多的東西一般會接受任何Map

public void setHashMap(Map<String, String> map){ 
    if (map != null) 
     hMap = new HashMap<String, String>(map); 
    else 
     hMap = new HashMap<String, String>(); 
} 

無需鑄造。此外,您的示例缺少返回類型。我假定你的意思是把void

2

一般情況下,你不能強制轉換一個MapHashMap沒有一類強制轉換異常的風險。如果MapTreeMap那麼演員將(並且必須)失敗。

可以避免異常使用instanceof你施放前檢查類型做,但如果測試說「不是一個HashMap」你被卡住。你將無法使演員工作。

實際的解決方案是:

  • 聲明hMap作爲Map不是HashMap
  • Map條目複製到一個新創建HashMap,或
  • (呸)創建一個自定義HashMap的子類,包裝真實的地圖。

(這些方法都不適用於所有情況...但我不能做具體的建議沒有什麼地圖被用於更多的細節。)


而當你在它,它可能是適當的提出與問題的供應商的錯誤報告圖書館。強迫你使用特定的Map實現(在它的表面上)是一個壞主意。