用Java将int转换为long

时间:2019-03-05 01:16:22

标签: java int

这个问题有很多答案,我已经看到了。我有一直在工作的代码,但是今天突然它开始抛出fromBase64  

loadFromBase64

错误来自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()。有什么建议

Stacktrace:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

2 个答案:

答案 0 :(得分:4)

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

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

为何突然开始出现错误;实际上,唯一可能的原因是直到失败之前,您总是将java.lang.Long个对象放置在input映射中,并且它发生了变化,因此您现在也将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<String, Long>)来避免这种情况。如果这样做,input.put("key", 42)将给出编译时错误。

答案 1 :(得分:0)

我建议不要将整数强制转换为长整数

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

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

答案更新

根据您的评论,我想您需要在处理Map之前检查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));

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

上面的代码段向您显示了实际的类型,以便您可以扩展代码以支持该类型,或者弄清楚为什么这种类型的内容进入了地图。

应该注意的是,将数据输入到地图中而不是从地图中取出数据时,这样做可能会更好。在这种情况下,您应该可以将地图更改为type。与以后处理混合数据类型杂乱无章的做法相比,最好还是对您的输入进行清理。