You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11中将HashMap列表强转为String列表未抛ClassCastException的原因

为什么这段代码没抛出ClassCastException?

核心原因是Java泛型的类型擦除机制,具体拆解如下:

  • Java泛型是编译期语法糖,编译完成后所有泛型参数都会被擦除。也就是说,List<?>和List<String>在运行时的实际类型都是List(你的代码里是List.of()返回的ImmutableList实现类),泛型的类型参数不会保留在运行时的类型信息中。
  • 你执行的(List<String>) list强转操作,JVM在运行时只会检查list是不是List类型(显然符合),无法校验泛型参数是否匹配,因此不会触发ClassCastException。

那什么时候会触发异常?当你尝试从listOfStrings中取出元素并当作String使用时:

List<?> list = List.of(new HashMap<>());
List<String> listOfStrings = (List<String>) list;
// 这一行会抛出ClassCastException,因为实际取出的是HashMap,无法转换为String
String s = listOfStrings.get(0);

此时JVM会自动插入强制转换逻辑,发现取出的元素实际类型是HashMap,与String不匹配,才会抛出异常。

内容的提问来源于stack exchange,提问作者Ehab Yassin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:33:11