安全投射到哈希映射

2022-09-02 19:30:09

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

我想避免类转换异常

HashMap<String, String> hMap;

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

答案 1

您可以制作(浅层)副本:

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

或者,如果它已经不是HashMap,请将其投射:

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

答案 2

通常,不能将 a 类型转换为 a,而不会有类强制转换异常的风险。如果 是,则强制转换将(并且必须)失败。MapHashMapMapTreeMap

您可以通过在转换之前使用来检查类型来避免异常,但是如果测试显示“不是HashMap”,则您就会陷入困境。您将无法使铸件正常工作。instanceof

实际的解决方案是:

  • 声明为非 ,hMapMapHashMap
  • 将条目复制到新创建的 中,或者MapHashMap
  • (yuck)创建一个包络真实映射的自定义 HashMap 子类。

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


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