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

时间:2013-02-23 02:29:08

标签: java arrays java-ee

我正在运行时遇到问题来编译这段代码这给我一个错误,即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;
    }

3 个答案:

答案 0 :(得分:4)

您可以执行以下操作,但我建议您使用Generics

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

如果您使用过如下的Generics,则不需要任何演员。

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

在这种情况下,你不需要任何铸造。引入Integer,Double等包装类的原因之一是避免强制转换。

答案 1 :(得分:3)

您的代码稍有变化即可获得成功:

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

Integer和Double不兼容,但int和double兼容扩展。在当前代码中,表达式的右侧(RHS)将自动升级为整数,然后您将该结果的强制转换指定为Double。这次演员失败了。

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

return x;

x的值加到Double中,并将其作为方法的结果返回。

答案 2 :(得分: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)