java.lang.Integer无法转换为java.lang.Long

时间:2019-09-23 06:46:04

标签: java json rest

我应该在我的Web服务中接收长整数。

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

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

java.lang.ClassCastException:java.lang.Integer无法转换为java.lang.Long

错误指向上面的代码。

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

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

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

6 个答案:

答案 0 :(得分:3)

IntegerLong都是Number的子类,因此我怀疑您可以使用:

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

无论obj.get("ipInt")返回的值是Integer引用还是Long引用,都应该起作用。如果在JSON中将ipInt指定为浮点数(例如"ipInt": 1.5),它还会 默默地继续运行。例外。

可以使用instanceof来专门检查LongInteger,但这很丑陋。

答案 1 :(得分:1)

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

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

那样,您正在对long进行显式拆箱,并且能够处理可能包含.的数据,该数据将返回Float或{{1 }}。

答案 2 :(得分:0)

您提到当您提供整数范围之外的值时,当前方法有效,但当您在整数范围内时,方法将失败。对于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();
}

答案 3 :(得分:0)

if may_none_value:
    objects = MyModel.objects.get(field1=other_value, field2=may_none_value)
else:
    objects = MyModel.objects.get(field1=other_value)

还可以。

答案 4 :(得分:0)

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);
}

答案 5 :(得分:0)

在Kotlin中,我只是使用这个:

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