如何安全地将哈希映射转换为哈希映射?安全地转换为哈希映射
我想避免类转换异常
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