2012-12-18 107 views
6

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

我想避免类转换异常

HashMap<String, String> hMap; 

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

为什么'setHashMap()'在真的需要'HashMap'时需要'Map'? –

+0

“安全”是什么意思?无法施放时你想要发生什么?是否可以接受副本? – Thilo

+0

我使用的外部库是使用hashmap而不是常规接口来实现的...... :( – Stainedart

回答

17

如果你想一(浅)复制:

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

如果你只想做时,它是不是已经是一个HashMap :

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

你可以这样做:

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

或者只是用try/catch包围转换,并在发生异常时捕获异常。

+0

假设当然''map'不是'HashMap ',因为如果是,那么只检查'instanceof HashMap'将不起作用。任何像String s = map.get(“foo”)的调用'会抛出'ClassCastException'。 – Brian

0

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

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

2

一般情况下,你不能强制转换一个MapHashMap没有一类强制转换异常的风险。如果MapTreeMap那么演员将(并且必须)失败。

可以避免异常使用instanceof你施放前检查类型做,但如果测试说“不是一个HashMap”你被卡住。你将无法使演员工作。

实际的解决方案是:

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

(这些方法都不适用于所有情况...但我不能做具体的建议没有什么地图被用于更多的细节。)


而当你在它,它可能是适当的提出与问题的供应商的错误报告图书馆。强迫你使用特定的Map实现(在它的表面上)是一个坏主意。