ClassCastException,将Integer转换为Double

时间:2011-04-06 12:27:53

标签: java classcastexception

ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));

每当我尝试运行我的程序时,我得到一个ClassCastException,指出:java.lang.Integer不能转换为java.lang.Double

10 个答案:

答案 0 :(得分:49)

我们可以将int转换为double,但我们无法对包装类IntegerDouble执行相同操作:

 int     a = 1;
 Integer b = 1;   // inboxing, requires Java 1.5+

 double  c = (double) a;   // OK
 Double  d = (Double) b;   // No way.

这显示了与运行时异常相对应的编译时错误。

答案 1 :(得分:30)

你所展示的代码实际上并不包括向ArrayList添加任何整数 - 但是如果你知道你有整数,你可以使用:< / p>

sum = (double) ((Integer) marks.get(i)).intValue();

这会将其转换为int,然后可以将其转换为double。你不能直接在盒装类之间进行投射。

请注意,如果您可以为ArrayList使用泛型,那么您的代码会更清晰。

答案 2 :(得分:9)

问题中发布的代码显然不是一个完整的示例(它没有向arraylist添加任何内容,它没有在任何地方定义i。)

首先,正如其他人所说,您需要了解原始类型与封装它们的类类型之间的区别。例如。 IntegerintDoubledoubleLonglong等等。 Java会在各种场景中自动进行装箱和取消装箱(过去你必须手动装箱和取消装箱库调用,但这被认为是一个丑陋的PITA)。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

您可以主要从一种原始类型转换为另一种原型(例外boolean),但您不能对盒装类型执行相同操作。将一个盒装类型转换为另一个类型有点复杂。特别是如果您事先不知道盒子类型。通常它涉及通过一种或多种原始类型进行转换。

所以你的问题的答案取决于你的arraylist中的内容,如果它只是你可以做的Integer类型的对象。

sum = ((double)(int)marks.get(i));

投射到int将在幕后首先将marks.get的结果投射到Integer,然后它将取消装箱整数。然后我们使用另一个强制转换将原始int转换为原始double。最后,当将结果分配给sum变量时,结果将自动退回到Double。 (请注意,在大多数情况下,总和为double而不是Double可能更有意义。)

如果你的arraylist包含多种类型,但它们都实现了Number接口(Integer,Short,Long,Float和Double都可以,但不包括Character和Boolean),那么你可以这样做。

sum = ((Number)marks.get(i)).doubleValue();

如果混合中还有其他类型,那么您可能需要考虑使用instanceof运算符来识别它们并采取适当的措施。

答案 3 :(得分:6)

这里要理解的两件事 -

1)如果您将原始interger投射到原始double。有用。例如 一切正常。

int pri=12; System.out.println((double)pri);

2)如果你试图将Integer对象转换为Double个对象,反之亦然,它会失败。

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn

解决方案 -

Soln 1) Integer i = 1; Double b = new Double(i);
soln 2) Double d = 2.0; Integer x = d.intValue();

答案 4 :(得分:5)

指定你的标记:

List<Double> marks = new ArrayList<Double>();

这称为泛型。

答案 5 :(得分:3)

将整数更改为double

int abc=12; //setting up integer "abc"

System.out.println((double)abc); 

代码将输出整数“abc”作为double,这意味着它将显示为“12.0”。注意小数位是多少,表示已经存储了这个精确数字。

如果您想要更改它,则与double相同,

double number=13.94;

System.out.println((int)number); 

此代码将在一行上打印,“number”作为整数打印。输出将为“13”。请注意,该值尚未向上舍入,实际上已省略了数据。

答案 6 :(得分:2)

sum = Double.parseDouble(""+marks.get(i));

答案 7 :(得分:1)

Integer x=10;
Double y = x.doubleValue();

答案 8 :(得分:0)

这意味着您的ArrayList在某些元素中有整数。除非你的一个元素中有一个整数,否则该转换应该有效。

确保你的arraylist没有整数的一种方法是将它声明为双打数组。

    ArrayList<Double> marks = new ArrayList<Double>();

答案 9 :(得分:0)

我认为主要的问题是你使用包装类进行转换,似乎它们是不兼容的类型。

但另一个问题是&#34;我&#34;是一个int,所以你正在投射最终结果,你也应该施展我。还可以尝试使用关键字&#34; double&#34;施展而不是&#34; Double&#34;包装类。

你可以在这里查看:

希望这会有所帮助。我发现该主题很有用,但我认为这有助于进一步澄清它。