如何安全地将 Map 转换为哈希 Map?
我想避免类转换异常
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) map;
}
如何安全地将 Map 转换为哈希 Map?
我想避免类转换异常
HashMap<String, String> hMap;
public void setHashMap(Map map){
hMap = (HashMap<String, String>) map;
}
您可以制作(浅)副本:
HashMap<String, String> copy = new HashMap<String, String>(map);
或者如果它还不是 HashMap 则将其强制转换:
HashMap<String, String> hashMap =
(map instanceof HashMap)
? (HashMap) map
: new HashMap<String, String>(map);
通常,您不能将 a 类型转换Map
为 aHashMap
而不会有类转换异常的风险。如果Map
是 aTreeMap
那么演员将(并且必须)失败。
您可以通过在强制转换之前使用检查类型来避免异常instanceof
,但如果测试显示“不是 HashMap”,您就会被卡住。你将无法使演员工作。
实际的解决方案是:
hMap
为 a Map
not a HashMap
,Map
到新创建的HashMap
,或(这些方法都不适用于所有情况......但如果没有更多关于地图用途的详细信息,我无法提出具体建议。)
当你这样做时,向有问题的库的提供者提交错误报告可能是合适的。强迫您使用特定的 Map 实现(从表面上看)是个坏主意。
您的函数应如下所示以避免任何类型的异常,例如ClassCastException
or 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);
}
}
您不应该转换为 HashMap!投射到地图!
如果你真的有你的问题的理由,那么,你必须创建一个新的 HashMap,以防 Map 不是 Map 的实例。
但这是个坏主意。
你可以做:
if (map instanceof HashMap) {
hMap = (HashMap<String, String>) map;
} else {
//do whatever you want instead of throwing an exception
}
或者只是用 try/catch 包围演员表,并在异常发生时捕获它。
如果你总是假设它是 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
.