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

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

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

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 值吗?

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

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

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

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

您提到当前方法在您提供整数范围之外的值时有效,但在您提供整数范围内时失败。这对于 API 来说是一种奇怪的行为,因为您似乎 需要 自己检查 return 类型。你可以做到这一点。通常的方法是 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();
}

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

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

这样,您将对 long 进行显式拆箱,并且能够处理可能包含 . 的数据,这将 return 和 [=18] =] 或 Double 代替。

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()