17

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

我想避免类转换异常

HashMap<String, String> hMap;

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

6 回答 6

39

您可以制作(浅)副本:

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

或者如果它还不是 HashMap 则将其强制转换:

HashMap<String, String> hashMap = 
   (map instanceof HashMap) 
      ? (HashMap) map 
      : new HashMap<String, String>(map);
于 2012-12-18T01:12:14.177 回答
4

通常,您不能将 a 类型转换Map为 aHashMap而不会有类转换异常的风险。如果Map是 aTreeMap那么演员将(并且必须)失败。

您可以通过在强制转换之前使用检查类型来避免异常instanceof,但如果测试显示“不是 HashMap”,您就会被卡住。你将无法使演员工作。

实际的解决方案是:

  • 声明hMap为 a Mapnot a HashMap,
  • 将条目复制Map到新创建的HashMap,或
  • (恶心)创建一个包装真实地图的自定义 HashMap 子类。

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


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

于 2012-12-18T01:22:48.107 回答
3

您的函数应如下所示以避免任何类型的异常,例如ClassCastExceptionor 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);
    }
}
于 2012-12-18T01:21:00.237 回答
1

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

于 2012-12-18T01:17:44.657 回答
0

你可以做:

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

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

于 2012-12-18T01:13:21.017 回答
0

如果你总是假设它是 a 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.

于 2012-12-18T01:22:41.877 回答