为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中将int转换为long

在Java中将int转换为long

富国沪深 2022-07-20 17:02:19
这个问题有很多答案,我已经看到了。我有一直在工作的代码,但今天突然它开始java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 排队return null == input.get(keyName) ? 0L : (long) input.get(keyName);错误来自(long) input.get(keyName). 我想知道为什么它突然开始坏了。(long) input.get(keyName)这对我来说看起来不错。我想这样做((Integer) input.get(keyName)).longValue(),但java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer因为地图有时包含long值。有什么建议么堆栈跟踪:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long     at accountservice.adapter.batch.testJob.SyncDriverPartitioner.getLongValueFromMap(SyncDriverPartitioner.java:78) ~[classes/:?]     at accountservice.adapter.batch.testJob.SyncDriverPartitioner.partition(SyncDriverPartitioner.java:47) ~[classes/:?]     at accountservice.adapter.batch.testJob.SyncDriverPartitioner$$FastClassBySpringCGLIB$$6f3315e4.invoke(<generated>) ~[classes/:?]     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.18.RELEASE.jar:4.3.18.RELEASE]
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

您可以利用所有数字原始包装扩展的事实java.lang.Number:


return null == input.get(keyName) ? 0L : ((Number) input.get(keyName)).longValue();

至于为什么它突然开始出错;真正唯一可能的原因是,在它开始失败之前,您总是将java.lang.Long对象放入inputMap 中,并且它发生了变化,因此您现在也将它们放入java.lang.Integer其中。


使用自动装箱和数字常量很容易发生这种情况:


long v = 42;

input.put("key", v);  // Puts a java.lang.Long in the map

input.put("key", 42); // Puts a java.lang.Integer in the map

input.put("key", 42L); // Puts a java.lang.Long in the map

您可以通过声明您的 Map 类型安全 ( Map<String, Long>) 来避免它。如果这样做,input.put("key", 42)将给出编译时错误。


查看完整回答
反对 回复 2022-07-20
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我建议不要将 int 转换为 long:


return null == input.get(keyName) ? 0L : Integer.toUnsignedLong(input.get(keyName))

至少通过这种方式,您应该获得更多关于为什么不能将其转换为 long 而不仅仅是 ClassCastException 的信息


答案更新


根据您的评论,我猜您将不得不在处理之前检查 Map 中条目的类型,我会建议以下内容:


    Object keyValue = input.get(keyName);

    if (null == keyValue) return 0L;

    String valueType = keyValue.getClass().getTypeName();

    if (valueType.equals(Long.class.getTypeName())) {

        return (long) keyValue;

    }

    if (valueType.equals(Integer.class.getTypeName())) {

        return Integer.toUnsignedLong((int) keyValue);

    }

    throw new TypeMismatchException(String.format("Type '%s' is not supported...", valueType));

这将允许您为不同类型的条目定义不同的操作,它可以扩展到您想要支持的任何类型。您也可以调整抛出的异常以提供相关信息。


上面的代码片段显示了实际的类型,以便您可以扩展代码以支持该类型,或者找出该类型的某些内容进入您的地图的原因。


应该注意的是,最好在将数据输入地图时执行此操作,而不是在将数据从地图中取出时执行此操作。在这种情况下,您应该能够将 map 更改为 type 。清理您的估算总是比在以后尝试处理混合数据类型的混杂更好。


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 269 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信