Java 安全转换到散列映射
如何将映射安全地强制转换为哈希映射 我想避免类强制转换异常Java 安全转换到散列映射,java,collections,map,hashmap,Java,Collections,Map,Hashmap,如何将映射安全地强制转换为哈希映射 我想避免类强制转换异常 HashMap<String, String> hMap; public void setHashMap(Map map){ hMap = (HashMap<String, String>) map; } HashMap-hMap; 公共void setHashMap(映射映射){ hMap=(HashMap)map; } 您可以制作(浅)副本: HashMap copy=新的HashMap(map)
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) map;
}
HashMap-hMap;
公共void setHashMap(映射映射){
hMap=(HashMap)map;
}
您可以制作(浅)副本:
HashMap copy=新的HashMap(map);
或者,如果它不是HashMap,则将其强制转换:
HashMap<String, String> hashMap =
(map instanceof HashMap)
? (HashMap) map
: new HashMap<String, String>(map);
HashMap HashMap=
(HashMap的映射实例)
? (HashMap)映射
:新HashMap(map);
您可以执行以下操作:
if (map instanceof HashMap) {
hMap = (HashMap<String, String>) map;
} else {
//do whatever you want instead of throwing an exception
}
if(HashMap的映射实例){
hMap=(HashMap)map;
}否则{
//做任何你想做的事,而不是抛出异常
}
或者只是用try/catch环绕强制转换,并在异常发生时捕获异常。您不应该强制转换为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);
}
}
public void setHashMap(映射映射){
if(map!=null&&map HashMap实例){
hMap=(HashMap)map;
}else if(map!=null){
hMap.putAll(地图);
}
}
如果您总是假设它是一个HashMap
,为什么不这样做呢
HashMap<String, String> hMap;
public void setHashMap(HashMap<String, String> map){
hMap = map;
}
无需浇铸。另外,您的示例缺少返回类型。我假设您打算将
作废
一般来说,您不能将映射
类型转换为哈希映射
,否则会出现类转换异常的风险。如果Map
是TreeMap
,则强制转换将(并且必须)失败
您可以通过在强制转换之前使用instanceof
检查类型来避免异常,但是如果测试显示“不是HashMap”,则您将被卡住。你无法让演员发挥作用
切实可行的解决办法是:
- 将
声明为hMap
而不是Map
HashMap
- 将
条目复制到新创建的Map
中,或HashMap
- (恶心)创建一个自定义HashMap子类来包装真实的映射
而且,当您进行此操作时,向有问题的库的提供者提交错误报告可能是合适的。强迫您使用特定的映射实现(表面上看)是一个坏主意。为什么
setHashMap()
需要Map
而实际上需要HashMap
?您所说的“安全”是什么意思?当无法投射时,您希望发生什么?可以复制吗?我正在使用的外部库是使用hashmap而不是常规接口实现的…:(@Thilo我想会的,但如果我可以委托给一个像ApacheUtils之类的理想库,当然假设map
不是HashMap
,因为如果是,那么只检查instanceof HashMap
是行不通的。任何像String s=map.get(“foo”)这样的调用
将抛出ClassCastException
。
HashMap<String, String> hMap;
public void setHashMap(HashMap<String, String> map){
hMap = map;
}
public void setHashMap(Map<String, String> map){
if (map != null)
hMap = new HashMap<String, String>(map);
else
hMap = new HashMap<String, String>();
}