在Java中将int转换为long

这个问题有很多答案,我已经看到了。我有一直在工作的代码,但今天突然它开始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]



富国沪深
浏览 271回答 2
2回答

偶然的你

您可以利用所有数字原始包装扩展的事实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);&nbsp; // Puts a java.lang.Long in the mapinput.put("key", 42); // Puts a java.lang.Integer in the mapinput.put("key", 42L); // Puts a java.lang.Long in the map您可以通过声明您的 Map 类型安全 ( Map<String, Long>) 来避免它。如果这样做,input.put("key", 42)将给出编译时错误。

汪汪一只猫

我建议不要将 int 转换为 long:return null == input.get(keyName) ? 0L : Integer.toUnsignedLong(input.get(keyName))至少通过这种方式,您应该获得更多关于为什么不能将其转换为 long 而不仅仅是 ClassCastException 的信息答案更新根据您的评论,我猜您将不得不在处理之前检查 Map 中条目的类型,我会建议以下内容:&nbsp; &nbsp; Object keyValue = input.get(keyName);&nbsp; &nbsp; if (null == keyValue) return 0L;&nbsp; &nbsp; String valueType = keyValue.getClass().getTypeName();&nbsp; &nbsp; if (valueType.equals(Long.class.getTypeName())) {&nbsp; &nbsp; &nbsp; &nbsp; return (long) keyValue;&nbsp; &nbsp; }&nbsp; &nbsp; if (valueType.equals(Integer.class.getTypeName())) {&nbsp; &nbsp; &nbsp; &nbsp; return Integer.toUnsignedLong((int) keyValue);&nbsp; &nbsp; }&nbsp; &nbsp; throw new TypeMismatchException(String.format("Type '%s' is not supported...", valueType));这将允许您为不同类型的条目定义不同的操作,它可以扩展到您想要支持的任何类型。您也可以调整抛出的异常以提供相关信息。上面的代码片段显示了实际的类型,以便您可以扩展代码以支持该类型,或者找出该类型的某些内容进入您的地图的原因。应该注意的是,最好在将数据输入地图时执行此操作,而不是在将数据从地图中取出时执行此操作。在这种情况下,您应该能够将 map 更改为 type 。清理您的估算总是比在以后尝试处理混合数据类型的混杂更好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java