安全转换为哈希映射

时间:2012-12-18 01:05:40

标签: java collections map hashmap

如何安全地将地图转换为哈希地图?

我想避免类强制转换异常

HashMap<String, String> hMap;

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

6 个答案:

答案 0 :(得分:26)

如果你想制作(浅)副本:

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

如果你只想在它还不是HashMap时才这样做:

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

答案 1 :(得分:3)

通常,您不能将Map类型转换为HashMap而不存在类别转换异常的风险。如果MapTreeMap,则演员将(并且必须)失败。

您可以通过在投射之前使用instanceof检查类型来避免异常,但如果测试显示“不是HashMap”,则会被卡住。你将无法进行演员表演。

实际的解决方案是:

  • hMap声明为Map而不是HashMap
  • Map条目复制到新创建的HashMap
  • (yuck)创建一个包装真实地图的自定义HashMap子类。

(这些方法都不适用于所有情况......但如果没有关于地图用途的更多细节,我无法提出具体建议。)


当你在这里时,可能适合向有问题的库的提供者提交错误报告。强迫你使用特定的Map实现是(从表面上看)一个坏主意。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

你可以这样做:

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

或者只是使用try / catch包围演员,并在发生异常时捕获它。

答案 4 :(得分:0)

你不应该转向HashMap!投射到地图!
如果你真的有理由提出问题,那么你必须创建一个新的HashMap,以防Map不是Map的实例。
但这是个坏主意。

答案 5 :(得分: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