如何安全地將哈希映射轉換爲哈希映射?安全地轉換爲哈希映射
我想避免類轉換異常
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) 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);
你可以這樣做:
if (map instanceof HashMap) {
hMap = (HashMap<String, String>) map;
} else {
//do whatever you want instead of throwing an exception
}
或者只是用try/catch包圍轉換,並在發生異常時捕獲異常。
假設當然''map'不是'HashMap
你不應該投射到HashMap!投射到地圖!
如果您確實有問題的原因,那麼您必須創建一個新的HashMap,以防Map不是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<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
。
一般情況下,你不能強制轉換一個Map
到HashMap
沒有一類強制轉換異常的風險。如果Map
是TreeMap
那麼演員將(並且必須)失敗。
可以避免異常使用instanceof
你施放前檢查類型做,但如果測試說「不是一個HashMap」你被卡住。你將無法使演員工作。
實際的解決方案是:
hMap
作爲Map
不是HashMap
,Map
條目複製到一個新創建HashMap
,或(這些方法都不適用於所有情況...但我不能做具體的建議沒有什麼地圖被用於更多的細節。)
而當你在它,它可能是適當的提出與問題的供應商的錯誤報告圖書館。強迫你使用特定的Map實現(在它的表面上)是一個壞主意。
爲什麼'setHashMap()'在真的需要'HashMap'時需要'Map'? –
「安全」是什麼意思?無法施放時你想要發生什麼?是否可以接受副本? – Thilo
我使用的外部庫是使用hashmap而不是常規接口來實現的...... :( – Stainedart