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>();
}