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 值吗?
Integer
和Long
都是Number
的子类,所以我怀疑你可以使用:
long ipInt = ((Number) obj.get("ipInt")).longValue();
无论 obj.get("ipInt")
返回的值是 Integer
引用还是 Long
引用,这都应该有效。它的缺点是,如果 ipInt
在 JSON 中被指定为浮点数(例如 "ipInt": 1.5
),它将 也 静默继续,您可能想在其中抛出异常。
您 可以 使用 instanceof
来专门检查 Long
和 Integer
,但这会非常难看。
您提到当前方法在您提供整数范围之外的值时有效,但在您提供整数范围内时失败。这对于 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()
我应该在我的网络服务中接收长整数。
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 值吗?
Integer
和Long
都是Number
的子类,所以我怀疑你可以使用:
long ipInt = ((Number) obj.get("ipInt")).longValue();
无论 obj.get("ipInt")
返回的值是 Integer
引用还是 Long
引用,这都应该有效。它的缺点是,如果 ipInt
在 JSON 中被指定为浮点数(例如 "ipInt": 1.5
),它将 也 静默继续,您可能想在其中抛出异常。
您 可以 使用 instanceof
来专门检查 Long
和 Integer
,但这会非常难看。
您提到当前方法在您提供整数范围之外的值时有效,但在您提供整数范围内时失败。这对于 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()