繁体   English   中英

将double转换为long时发生转换错误

[英]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: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
        }
    ]
}

您正在尝试将Double转换为long通过强制转换,这是不可能的。 您可以通过调用longValueDouble转换为它的long对应longValue

@Override
public long getStartTime() {
    return jsonMap.get(KEY_START_TIME).longValue();
}

这是因为在JSON中,就像JavaScript一样, 所有数字都是浮点数 (嗯, 规范没有任何区别 ),因此您使用的JSON库很可能会返回Double对象,无论该数字是否有一个分数。

Double, Long, Float, Integer, Long, ShortNumber的子类,它们不是基元。 您不能在它们之间投掷!

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM