2013-02-23 88 views
3

我面临的问题在运行时编译这段代码这是抛出一个错误,java.lang.Integer不能转换为Java.lang.Double。我会更乐意,如果有人帮助我改正这个代码java.lang.ClassCastException: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; 
    } 
+1

这是因为你不能将整数转换为双精度。它们是两个不同的类,而不是另一个的子类。最有可能你神秘地从listabc中获取的元素是一个Integer。 (因为你依赖于隐式的“拳击”转换,所以你将自己搞糊涂了,当你刚刚学习时就不明智了。) – 2013-02-23 02:39:29

+0

在问这样的问题之前,请看Java中的类层次结构。 – ATrubka 2013-02-23 04:58:44

+2

公平地说,基于C语言通过对两个基本不相关的概念(数据格式转换和参考层次操作)使用“cast”(术语和符号)极大地混淆了这个问题。将“float”转换为“int”是将“Number”转换为“Integer”的完全不同且不相关的概念,例如。 (我不记得在教科书/参考资料中讨论过这种令人困惑的二分法,或者在课堂上讨论这个问题。) – 2013-02-25 02:36:34

回答

4

你可以做如下,但我会建议你Generics去。

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

如果你已经使用了下面的泛型,你不需要任何铸造。

List<Integer> listabc 
HashMap<String, Integer> hashmap 
x = listabc.get(0) * 100/total; 

在这种情况下,你不需要任何铸件。引入Integer,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) 
2

代码中的微小变化将授予成功:

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

整数和双精度都投不兼容,但是int和double正在扩大兼容。在你当前的代码中,表达式的右边(RHS)被自动装箱到一个Integer,然后你指定一个结果到Double。此投射失败。

通过改为指定加宽转换,将Integer结果取消装箱到int,然后转换为double。然后最后这一行:

return x; 

盒向上的x值插入到一个Double并返回它作为该方法的结果。

相关问题