[英]Casting error when converting double to long
我遇到了一个我不了解的奇怪问题。 我正在研究使用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
}
]
}
Double, Long, Float, Integer, Long, Short
是Number的子类,它们不是基元。 您不能在它们之间投掷!
Java仅在原始类型及其对应的对象包装器类之间使用自动装箱,但不幸的是,自动装箱不在不同Number类型(例如, long to Integer
Objects和原始对象之间使用。 为了帮助您在不同的Number类型之间进行转换,每个Number对象都配备了byteValue(),doubleValue(),floatValue(),intValue(),longValue(),shortValue()
方法。 因此,您实际上可以调用:
jsonMap.get(KEY_START_TIME).longValue();
或者甚至可以利用自动装箱功能使用双播
(long)(double)jsonMap.get(KEY_START_TIME);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.