繁体   English   中英

java.lang.Integer 不能转换为 java.lang.Long

[英]java.lang.Integer cannot be cast to java.lang.Long

我应该在我的 web 服务中收到长 integer 。

long ipInt = (long) obj.get("ipInt");

当我测试我的程序并输入 ipInt 值 = 2886872928 时,它给了我成功。 但是,当我测试我的程序并将 ipInt 值 = 167844168 时,它给了我错误:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

错误是指向上面的代码。

仅供参考,我的数据采用 JSON 格式:

{
    "uuID": "user001",
    "ipInt": 16744168,
    "latiTude": 0,
    "longiTude": 0,
}

有什么建议可以确保我的代码能够同时接收 ipInteger 值吗?

IntegerLong都是Number的子类,所以我怀疑你可以使用:

long ipInt = ((Number) obj.get("ipInt")).longValue();

无论obj.get("ipInt")返回的值是Integer引用还是Long引用,这都应该有效。 它的缺点是,如果在ipInt指定为浮点数(例如"ipInt": 1.5 ),它也会静默继续,您可能希望在其中抛出异常。

可以使用instanceof来专门检查LongInteger ,但这会非常难看。

我们不知道obj.get()返回什么,所以很难准确地说,但是当我使用返回Number子类的此类方法时,我发现将其强制转换为Number并调用适当的xxxValue()比让自动拆箱抛出ClassCastException

long ipInt = ((Number)obj.get("ipInt")).longValue();

这样,您就可以对long进行显式拆箱,并且能够处理可能包含. , 这将返回一个FloatDouble

您提到当前方法在您提供 integer 范围之外的值时有效,但在 integer 范围内时失败。 对于 API 来说,这是一种奇怪的行为,因为您似乎需要自己检查返回类型。 可以这样做。 通常的方法是使用instanceof 就像是,

long ipInt;
Object o = obj.get("ipInt");
if (o instanceof Integer) {
    ipInt = ((Integer) o).intValue();
} else if (o instanceof Long) {
    ipInt = ((Long) o).longValue();
}
Long.valueOf(jo.get("ipInt").toString());

没关系。

public static void main(String[] args) {
    JSONObject jo = JSON.parseObject(
        "{    \"uuID\": \"user001\",    \"ipInt\": 16744168,    \"latiTude\": 0,    \"longiTude\": 0}");
    System.out.println(jo);
    long sellerId1 =  Long.valueOf(jo.get("ipInt").toString());
    //Long sellerId1 = (long)jo.get("ipInt");
    System.out.println(sellerId1);
}

在 kotlin 我只是使用这个:

val myInt: Int = 10
val myLong = myInt.toLong()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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