树图 ClassCastException
TreeMap ClassCastException
无法确定导致此 ClassCastException 的字符串转换的来源。我已经清除了地图,以便它只包含一个条目 (115,1563),并且我确保两个参数都是整数。
首先我从文件中读取并填充 scoreMap。
private void populateScoreMap(String toConvert)
{
Gson gson = new GsonBuilder().create();
ScoreRecord.scoreMap = (TreeMap<Integer,Integer>) gson.fromJson(toConvert, ScoreRecord.scoreMap.getClass());
}
得分记录class
public class ScoreRecord
{
public static SortedMap<Integer,Integer> scoreMap = new TreeMap<Integer, Integer>();
}
然后我尝试在 ScoreGraph 中添加一个条目 class
private void addTodaysScore() {
Integer todaysScore = getIntent().getIntExtra("score",0);
Calendar calendar = Calendar.getInstance();
Integer dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
ScoreRecord.scoreMap.put(dayOfYear,todaysScore);
}
异常
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Integer.java:1044)
at java.util.TreeMap.put(TreeMap.java:593)
at com.xxx.xxx.xxx.xxx.ScoreGraph.addTodaysScore(ScoreGraph.java:63)
问题是 ScoreRecord.scoreMap.getClass()
的结果是 Java class,其中不包含与泛型相关的信息。在您的特定情况下,它只是 SortedMap
相当于 SortedMap<Object, Object>
而不是 SortedMap<Integer, Integer>
.
您需要做的是创建 Gson 所谓的 »type token«。这将为 Gson 提供成功解析您的集合所需的提示:
private void populateScoreMap(String toConvert)
{
Gson gson = new GsonBuilder().create();
Type collectionType = new TypeToken<SortedMap<Integer, Integer>>(){}.getType();
ScoreRecord.scoreMap = gson.fromJson(toConvert, collectionType);
}
这个在Gson的documentation
中也有说明
无法确定导致此 ClassCastException 的字符串转换的来源。我已经清除了地图,以便它只包含一个条目 (115,1563),并且我确保两个参数都是整数。
首先我从文件中读取并填充 scoreMap。
private void populateScoreMap(String toConvert)
{
Gson gson = new GsonBuilder().create();
ScoreRecord.scoreMap = (TreeMap<Integer,Integer>) gson.fromJson(toConvert, ScoreRecord.scoreMap.getClass());
}
得分记录class
public class ScoreRecord
{
public static SortedMap<Integer,Integer> scoreMap = new TreeMap<Integer, Integer>();
}
然后我尝试在 ScoreGraph 中添加一个条目 class
private void addTodaysScore() {
Integer todaysScore = getIntent().getIntExtra("score",0);
Calendar calendar = Calendar.getInstance();
Integer dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
ScoreRecord.scoreMap.put(dayOfYear,todaysScore);
}
异常
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Integer.java:1044)
at java.util.TreeMap.put(TreeMap.java:593)
at com.xxx.xxx.xxx.xxx.ScoreGraph.addTodaysScore(ScoreGraph.java:63)
问题是 ScoreRecord.scoreMap.getClass()
的结果是 Java class,其中不包含与泛型相关的信息。在您的特定情况下,它只是 SortedMap
相当于 SortedMap<Object, Object>
而不是 SortedMap<Integer, Integer>
.
您需要做的是创建 Gson 所谓的 »type token«。这将为 Gson 提供成功解析您的集合所需的提示:
private void populateScoreMap(String toConvert)
{
Gson gson = new GsonBuilder().create();
Type collectionType = new TypeToken<SortedMap<Integer, Integer>>(){}.getType();
ScoreRecord.scoreMap = gson.fromJson(toConvert, collectionType);
}
这个在Gson的documentation
中也有说明