我花了好几个小时来处理这个bug,对我来说这是一个非常奇怪的行为:
这是我的代码:
MapmyMap = 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();
用: Float value1 = myMap.get("key1");
我得到完全相同的错误,即使我没有使用任何双倍!
另外我不明白为什么它说Double不能被转换为Float,当我实际上试图将Float转换为Double时,所以它是另一种方式.
更新:回答路易斯和安德烈亚斯的建议,myMap.get("key1").getClass()
给我Double
,myMap.get("key1") instanceof Double
平等true
和myMap.get("key1") instanceof Float
平等false
.
我在线上Double value1 = myMap.get("key1").doubleValue();
或在线上得到错误Float value1 = myMap.get("key1");
这可能是一些腐败的正常症状,Map
从一开始myService.calculateData
就是如何构建的; 它不是真正的一个Map
,它有Double
,它出现.这通常表明存在一些受到抑制的不安全演员表或原型.
该投地Float
将被隐式插入map.get("key1")
在编译时调用,如泛型是如何正常开展的一部分.