将double转换为long时的转换错误

时间:2015-11-12 00:50:37

标签: java

我遇到了一个我不理解的奇怪问题。我正在开发一个使用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:48getStartMethod()
  • 的回报
  • Silicon.java:34System.out.println()

请求的一个示例,match_idmatch_seq_numstart_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
        }
    ]
}

2 个答案:

答案 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, ShortNumber的子类,它们不是原语。你不能在他们之间施放!

Java仅在原始类型及其对应的对象包装类之间使用自动装箱,但不幸的是,它不在对象和不同数字类型的基元之间,例如long to Integer。为了帮助您在不同的数字类型之间进行转换,每个Number对象都配备了byteValue(),doubleValue(),floatValue(),intValue(),longValue(),shortValue()方法。所以,你实际上可以打电话:

jsonMap.get(KEY_START_TIME).longValue();

或者您甚至可以使用双播,利用自动装箱

(long)(double)jsonMap.get(KEY_START_TIME);