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
相关产品推荐
相关产品推荐

