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

TreeMap出现ClassCastException:无法定位引发异常的字符串转换来源

解决TreeMap反序列化时的ClassCastException问题

兄弟,我太懂你这种明明看着数据都对,却突然炸ClassCastException的憋屈了!咱们来一步步拆解问题:

你遇到的核心问题是Gson反序列化泛型集合时的类型擦除坑——你用ScoreRecord.scoreMap.getClass()拿到的是TreeMap.class,但Gson没法通过这个Class对象知道你要的是TreeMap<Integer, Integer>,它会默认把JSON里的键解析成String类型(毕竟JSON的键本质都是字符串),值可能也会转成Double,这就导致你的TreeMap里实际存的是String -> Double的键值对,后续操作时和你声明的Integer -> Integer泛型不匹配,直接炸类型转换异常。

哪怕你现在只留了(115,1563)这组数据,JSON里的"115"是字符串,Gson没收到泛型指令的话,就会把它存成String键,你用Integer去取或者TreeMap内部排序时,自然就报错了。

直接给你解决办法:

用Gson的TypeToken明确泛型类型,这是处理泛型集合反序列化的标准操作:

private void populateScoreMap(String toConvert) {
    Gson gson = new GsonBuilder().create();
    // 用TypeToken指定具体的泛型类型
    Type treeMapType = new TypeToken<TreeMap<Integer, Integer>>() {}.getType();
    ScoreRecord.scoreMap = gson.fromJson(toConvert, treeMapType);
}

额外验证点:

  • 确认你的JSON格式是标准的数字键值,比如:

    {"115": 1563}
    虽然JSON键是字符串,但Gson会自动把它转成Integer类型,完全符合你的需求。

  • 如果改完还是报错,再检查后续对scoreMap的操作,有没有地方不小心塞了非Integer的键值进去,但根据你清空后只留一组整数条目的描述,大概率是反序列化的泛型问题。

本质上就是TreeMap依赖键的Comparable特性,当实际键类型是String而你声明的是Integer时,类型转换和比较都会触发异常,用TypeToken把泛型信息传递给Gson就搞定了。

内容的提问来源于stack exchange,提问作者Ryan Prinsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:49