我花了好几个小时来处理这个错误,对我来说这是一个非常奇怪的行为:
这是我的代码:
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()
给了我Double
,myMap.get("key1") instanceof Double
等于true
和myMap.get("key1") instanceof Float
等于false
。
我在第Double value1 = myMap.get("key1").doubleValue();
行或Float value1 = myMap.get("key1");
答案 0 :(得分:5)
这对于Map
来自myService.calculateData
的{{1}}的构建方式的某些腐败是正常的症状;它不是真的一个Map<String, Float>
,它有Double
个。这通常表明存在一些被压制的不安全演员表或原型。
在编译时,Float
的转换将隐式插入到map.get("key1")
调用中,作为泛型通常如何实现的一部分。