ClassCastException Double to Float,即使我没有使用Double

时间:2015-12-02 21:13:44

标签: java casting

我花了好几个小时来处理这个错误,对我来说这是一个非常奇怪的行为:

这是我的代码:

Map<String, Float> myMap = myService.calculateData(DateTime startDate, DateTime endDate);

if (!myMap.isEmpty()) {
    Double value1 = myMap.get("key1").doubleValue(); 
}

在调试器中,一切正常,我可以看到myMap的所有值,我可以将value1的值设为Double。

但是,IntelliJ会抛出错误:

  

java.lang.ClassCastException:           java.lang.Double无法强制转换为java.lang.Float

我尝试替换Double value1 = myMap.get("key1").doubleValue();

with:Float value1 = myMap.get("key1");

我得到完全相同的错误,即使我没有使用任何Double!

此外,我不明白为什么它说Double不能被施放到Float,当我实际上试图将Float转换为Double时,所以它反过来

更新:回答路易斯和安德烈亚斯的建议,myMap.get("key1").getClass()给了我DoublemyMap.get("key1") instanceof Double等于truemyMap.get("key1") instanceof Float等于false

我在第Double value1 = myMap.get("key1").doubleValue();行或Float value1 = myMap.get("key1");

上收到错误

1 个答案:

答案 0 :(得分:5)

这对于Map来自myService.calculateData的{​​{1}}的构建方式的某些腐败是正常的症状;它不是真的一个Map<String, Float>,它有Double个。这通常表明存在一些被压制的不安全演员表或原型。

在编译时,Float的转换将隐式插入到map.get("key1")调用中,作为泛型通常如何实现的一部分。