"包装在 try/catch(ClassCastException) 中是否足以避免运行时问题?-6ren"> "包装在 try/catch(ClassCastException) 中是否足以避免运行时问题?-我正在为Map编写一个递归转换器。 (意味着 Object 部分也可以是 Map ,依此类推... 代码片段: if(value instanceof Map) { try {-6ren">
gpt4 book ai didi

java - 将 "Unchecked cast from Object to Map"包装在 try/catch(ClassCastException) 中是否足以避免运行时问题?

转载 作者:行者123 更新时间:2023-12-01 18:18:05 27 4
gpt4 key购买 nike

我正在为Map<String, Object>编写一个递归转换器。 (意味着 Object 部分也可以是 Map<String, Object> ,依此类推...

代码片段:

if(value instanceof Map) {
try {
return convert((Map<String, Object>)value);
} catch (ClassCastException ccex) {
ccex.printStackTrace();
return null;
}
}

(Map<String, Object>)value 上仍然有警告:

Type safety: Unchecked cast from Object to Map<String,Object>

虽然我可以用 @SuppressWarnings("unchecked") 来注释它,我好奇的是:

<小时/>

catch (ClassCastException ccex)上面的 block 足以避免不安全转换的任何问题?

最佳答案

Is the catch (ClassCastException ccex) block above enough to avoid any issues with that unsafe cast?

不,正是因为它没有被检查。它将检查它是否是 Map ,但这就是 JVM 级别的全部内容,因为类型删除。它可能包含非字符串键,并且该转换不会检测到它。

考虑这个例子:

import java.util.*;

class Test {
public static void main(String[] args) throws Exception {
Map raw = new HashMap();
raw.put(new Object(), 10);

// This cast won't fail
Map<String, Object> typed = (Map<String, Object>) raw;

// But this will fail...
for (String key : typed.keySet()) {
System.out.println(key);
}
}
}

基本上,编译器会在每次访问键或值时插入强制转换,这些隐藏的强制转换可能会失败 - 但它们与 Map<String, Object> 的强制转换不在同一位置 .

关于java - 将 "Unchecked cast from Object to Map<String,Object>"包装在 try/catch(ClassCastException) 中是否足以避免运行时问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28432199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com