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

5

我在运行时编译这段代码时遇到了问题,它抛出了一个错误:java.lang.Integer无法转换为Java.lang.Double。如果有人能帮我纠正这段代码,我将非常感激。

 double x;

 public Double getMethod() {

     HashMap hashmap= new HashMap();

     hashmap = SumCal();

     List  listabc = (List) hashmap.get("abclist");
     int total=(Integer) hashmap.get("all_total");
     x = (Double) listabc.get(0)*100/total;
     return x;
    }

2
这是因为你无法将整数(Integer)转换为双精度浮点数(Double)。它们是两个不同的类,而且一个不是另一个的子类。最有可能的情况是你神秘地从listabc中获取的元素是一个整数。 (你会让自己感到困惑,因为你依赖隐式的“装箱”转换,这在你刚开始学习时并不明智。) - Hot Licks
请在提出这样的问题之前查看Java中的类层次结构。 - ATrubka
2
公平地说,基于C的语言通过使用“转换”(术语和符号)来表示两个本质上不相关的概念——数据格式转换和引用层次结构操作——使问题变得非常混乱。将“float”强制转换为“int”与将“Number”强制转换为“Integer”是完全不同且不相关的概念,例如。(我无法回想起曾经在教科书/参考资料中讨论过这种令人困惑的二分法,或者听说过它在课堂上被讨论过。) - Hot Licks
3个回答

6
您可以按照以下步骤进行操作,但我建议您使用泛型。具体请参考Generics
x = ((Integer) listabc.get(0) * 100 / total);

如果您使用了下面这种泛型,就不需要进行任何类型转换。
List<Integer> listabc 
HashMap<String, Integer> hashmap 
x = listabc.get(0) * 100 / total;

在这种情况下,您不需要进行任何转换。Integer、Double等包装类的出现之一是为了避免转换。

5
您只需稍作修改就能成功:

您只需稍作修改就能成功:

x = (double) listabc.get(0)*100/total;

整数和双精度浮点数不兼容,但是int和double可以进行扩展兼容。在您当前的代码中,表达式的右侧(RHS)被自动装箱为一个Integer,然后您指定将该结果转换为Double。这个转换失败了。

相反,通过指定扩展转换,Integer结果会被拆箱为int,然后转换为double。最后,执行以下行:

return x;

将变量 x 的值打包为 Double 类型,并将其作为该方法的结果返回。

0

首先,您不应该使用通用的HashMap,因为编译器无法帮助您处理类型。请尝试声明以下内容:

HashMap<String, Integer> hashmap = new HashMap();

我不建议存储值类型不同的HashMap,因为这容易引发编程错误。而且,将int强制转换为Double是没有必要的。你可以执行以下任何操作:

x = listabc.get(0) * 100.0 / total; // multiply by a floating-point number

x = (double) listabc.get(0) * 100 / total; // cast with (double)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接