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