安全投射到哈希图

问题描述 投票:11回答:6

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

我想避免类强制转换异常

HashMap<String, String> hMap;

public void setHashMap(Map map){
    hMap = (HashMap<String, String>) map;
}
java collections map hashmap
6个回答
31
投票

您可以制作(浅)副本:

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

或如果还不是HashMap,则将其投射:

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

3
投票

您的函数应如下所示,以避免发生诸如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
投票

[通常,如果没有类转换例外的风险,则无法将Map转换为HashMap。如果MapTreeMap,则强制转换将(并且必须)失败。

您可以avoid通过在投射前使用instanceof来检查类型来异常,但是如果测试显示“不是HashMap”,则您将陷入困境。您将无法使演员表正常工作。

实际解决方案是:

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


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

0
投票
您可以做:

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

0
投票
如果您总是假设它是HashMap<String, String>,为什么不这样做呢?
© www.soinside.com 2019 - 2024. All rights reserved.