java - 即使我不使用 Double,ClassCastException Double 也会 float

标签 java casting

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

这是我的代码:

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() 给了我 DoublemyMap.get( "key1") instanceof Double 等于 truemyMap.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/

相关文章:

java - 将 Eclipse 插件添加到 Eclipse RCP App

java - 在 Java 中将 int 与潜在的 null Integer 进行比较的最简洁方法是什么?

java - 如何删除 java 中未经检查的强制转换警告?

java - ORA-00933: SQL 命令未正确结束: java

java - 并行执行两个 AsyncTask

java - 如何在 Gradle 中使用 Quarkus gRPC 扩展?

java - 在保存、更新和删除时发出事件的 DAO

c++ - 使用 static_cast 将任何指针转换到 char 指针

c++ - 为什么 C++ 引入 duration_cast 而不是使用 static_cast?

casting - NSData(字节:length:) convert [Byte] to UnsafePointer<Void> in Swift?