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

ina*_*yzi 15 java rest json

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

long ipInt = (long) obj.get("ipInt");
Run Code Online (Sandbox Code Playgroud)

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

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

错误是指向上面的代码。

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

{
    "uuID": "user001",
    "ipInt": 16744168,
    "latiTude": 0,
    "longiTude": 0,
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 32

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

long ipInt = ((Number) obj.get("ipInt")).longValue();
Run Code Online (Sandbox Code Playgroud)

无论返回的值obj.get("ipInt")Integer引用还是Long引用,这都应该有效。它有缺点,它会是否继续默默ipInt已被指定为浮点数(如"ipInt": 1.5在JSON),在那里你可能要抛出一个异常,而不是。

可以改用专门instanceof检查Long和检查Integer,但这会非常难看。

  • @Matthieu:您的意思是您“更喜欢”无效数据默默地通过系统并导致数据丢失的情况吗?我个人更喜欢尽早通过硬错误捕获无效数据。如果某些代码尝试用非数字更新我的银行余额,我宁愿系统崩溃也不愿将其设置为 0 :) (2认同)

Mat*_*ieu 8

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

long ipInt = ((Number)obj.get("ipInt")).longValue();
Run Code Online (Sandbox Code Playgroud)

这样,您就可以对 a 进行显式拆箱long,并且能够处理可能包含 a 的数据.,这将返回 aFloatDouble