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)将给出编译时错误。
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 。清理您的估算总是比在以后尝试处理混合数据类型的混杂更好。
添加回答
举报