java.lang.Integer 无法转换为 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 值吗?

原文由 inayzi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

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

无论 obj.get("ipInt") 返回的值是 Integer 参考还是 Long 参考,这都应该起作用。它的缺点是,如果 ipInt 已在 JSON 中指定为浮点数(例如 "ipInt": 1.5 ),它 也会 静默继续,您可能想要抛出异常。

可以 使用 instanceof 来检查 LongInteger 具体来说,但这会非常难看。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

这样,您 long 进行显式拆箱,并且能够处理可能包含 . 的数据,这将返回 FloatDouble 代替。

原文由 Matthieu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题