症状
某个强制转换能通过编译,但在特定数据下运行时抛出 ClassCastException。类型擦除让泛型转换多为未检查,因此编译器无法总是阻止不匹配;原始集合与 Map 允许混合元素类型,更易发生。消息同时给出实际类与目标类,点出错误的假设所在。
诊断
读取消息中的运行时类型;用 -Xlint:unchecked 找出未检查转换;转换前打印实际 class。
App 2>&1 | grep ClassCastException
根因
某处转换假定了一个值并不具有的运行时类型。类型擦除使许多转换未被检查,因此不匹配只在运行到该值时才暴露。
修复
修正泛型使转换受检查,避免原始集合,在运行时类型多变处用 instanceof 守卫,并让反序列化目标与实际负载一致。用多态分派替代强制转换,使正确行为无需显式转换即可选中。
验证
重跑失败路径确认转换不再抛错,再打印或断言运行时类型,确保值确为代码所期望。既无异常又类型正确才算修好。
常见陷阱
用 @SuppressWarnings(“unchecked”) 压制警告会隐藏真实不匹配;应先修正泛型。