我遇到了一个我不理解的奇怪问题。我正在开发一个使用Steam API获取Dota 2统计信息的Java程序。
for (int i = 0; i < MAX_REQUESTS; i++) {
competitiveMatches.addAll(getByStartTime(startTime));
System.out.println("Time: " + competitiveMatches.get(competitiveMatches.size() - 1).getStartTime());
startTime = competitiveMatches.get(competitiveMatches.size() - 1).getStartTime();
}
我在System.out.println(...)
行上收到错误说:
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long
对我来说没有任何意义,我在我的列表中请求最后一个匹配,并访问其start_time
变量,这是下面的方法。它的工作原理是查看JSON Map并获取该位置的值。
@Override
public long getStartTime() {
return (Long) jsonMap.get(KEY_START_TIME);
}
完整堆栈跟踪:
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long
at de.inkvine.dota2stats.domain.impl.MatchOverviewImpl.getStartTime(MatchOverviewImpl.java:48)
at Silicon.main(Silicon.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
其中
MatchOverviewImpl.java:48
是getStartMethod()
Silicon.java:34
是System.out.println()
行请求的一个示例,match_id
,match_seq_num
和start_time
都存储为双打,例如1.929962146E9
:
{
"match_id":1929981128,
"match_seq_num":1705354677,
"start_time":1447289804,
"lobby_type":8,
"radiant_team_id":0,
"dire_team_id":0,
"players":[
{
"account_id":82228820,
"player_slot":0,
"hero_id":19
},
{
"account_id":4294967295,
"player_slot":128,
"hero_id":14
}
]
}
答案 0 :(得分:1)
您正尝试通过投射将Double
转换为long
,这是不可能的。您可以致电longValue
:
Double
转换为long
对应方
@Override
public long getStartTime() {
return jsonMap.get(KEY_START_TIME).longValue();
}
这是因为在JSON中,像JavaScript一样all numbers are floating point numbers(好吧,the spec doesn't make any distinction),所以你使用的JSON库可能会返回Double
个对象,无论是否为不是数字有一个小数部分。
答案 1 :(得分:1)
Double, Long, Float, Integer, Long, Short
是Number的子类,它们不是原语。你不能在他们之间施放!
Java仅在原始类型及其对应的对象包装类之间使用自动装箱,但不幸的是,它不在对象和不同数字类型的基元之间,例如long to Integer
。为了帮助您在不同的数字类型之间进行转换,每个Number对象都配备了byteValue(),doubleValue(),floatValue(),intValue(),longValue(),shortValue()
方法。所以,你实际上可以打电话:
jsonMap.get(KEY_START_TIME).longValue();
或者您甚至可以使用双播,利用自动装箱
(long)(double)jsonMap.get(KEY_START_TIME);