我花了几个小时研究这个错误,这对我来说是一个非常奇怪的行为:
这是我的代码:
Map<String, Float> myMap = myService.calculateData(DateTime startDate, DateTime endDate);
if (!myMap.isEmpty()) {
Double value1 = myMap.get("key1").doubleValue();
}
在调试器中,一切正常,我可以看到 myMap
的所有值,并且可以获得 Double 形式的 value1
值。
但是随后,IntelliJ 抛出错误:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Float
我尝试替换 Double value1 = myMap.get("key1").doubleValue();
with:Float value1 = myMap.get("key1");
即使我没有使用任何 Double ,我也得到了完全相同的错误!
另外,我不明白为什么它说 Double 不能转换为 Float,而我实际上是在尝试将 Float 转换为 Double,所以情况正好相反。
更新:为了回答 Louis 和 Andreas 的建议, 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
首先被 build ;这不是真正 Map<String, Float>
,它有Double
就在里面。这通常表明存在一些被抑制的不安全强制转换或原始类型。
类型转换Float
将隐式插入 map.get("key1")
在编译时调用,作为泛型通常实现方式的一部分。
关于java - 即使我不使用 Double,ClassCastException Double 也会 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34053111/