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

Kat*_* L. 2 java casting

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

这是我的代码:

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

if (!myMap.isEmpty()) {
    Double value1 = myMap.get("key1").doubleValue(); 
}
Run Code Online (Sandbox Code Playgroud)

在调试器中,一切正常,我可以看到所有的值,myMap我可以得到value1Double 的值.

但是,IntelliJ会抛出错误:

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

我试过更换 Double value1 = myMap.get("key1").doubleValue();

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

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

另外我不明白为什么它说Double不能被转换为Float,当我实际上试图将Float转换为Double时,所以它是另一种方式.

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

我在线上Double value1 = myMap.get("key1").doubleValue();或在线上得到错误Float value1 = myMap.get("key1");

Lou*_*man 5

这可能是一些腐败的正常症状,Map从一开始myService.calculateData就是如何构建的; 它不是真正的一个Map<String, Float>,它有Double,它出现.这通常表明存在一些受到抑制的不安全演员表或原型.

该投地Float将被隐式插入map.get("key1")在编译时调用,如泛型是如何正常开展的一部分.

  • 通过`System.out.println(myMap.get("key1").getClass())`来确认. (3认同)