ClassCastException,将Integer转换为Double

Khu*_*uba 41 java classcastexception

ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
Run Code Online (Sandbox Code Playgroud)

每次我尝试运行我的程序时,都会遇到一个ClassCastException:java.lang.Integer无法强制转换为java.lang.Double

And*_*s_D 51

我们可以投的int一个double,但我们不能做的包装类相同Integer和Double:

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

 double  c = (double) a;   // OK
 Double  d = (Double) b;   // No way.
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*eet 32

那么您已经显示的代码实际上不包括添加任何整数的ArrayList-但是如果你不知道你有整型,你可以使用:

sum = (double) ((Integer) marks.get(i)).intValue();
Run Code Online (Sandbox Code Playgroud)

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

请注意,如果您可以使用泛型ArrayList,您的代码将更清晰.

  • 如果您使用Integer.doubleValue(),则无需将int强制转换为double。sum =((Integer)marks.get(i))。doubleValue();`会更加简洁。 (2认同)

小智 10

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

首先,正如其他人所说,您需要了解原始类型与封装它们的类类型之间的区别.例如Integer盒子int,Double盒子double,Long盒子long等等.Java会在各种情况下自动装箱和取消装箱(过去你必须手动装箱和取消装箱库调用,但这被视为丑陋的PITA).

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

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

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

sum = ((double)(int)marks.get(i));
Run Code Online (Sandbox Code Playgroud)

演员阵容到int会幕后第一投的成绩marks.get来Integer,那么它会拆箱该整数.然后我们使用另一个强制转换将原语转换为原int语double.最后,当将结果Double分配给sum变量时,结果将自动退回到a .(可以肯定的是,在大多数情况下,总和更有意义,double而不是Double大多数情况下).

如果你的arraylist包含多种类型的混合,但它们都实现了Number接口(Integer,Short,Long,Float和Double都可以,但字符和布尔都没有),那么你可以这样做.

sum = ((Number)marks.get(i)).doubleValue();
Run Code Online (Sandbox Code Playgroud)

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


sap*_*apy 7

这里要理解的两件事 -

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
Run Code Online (Sandbox Code Playgroud)

方案 -

Soln 1) Integer i = 1; Double b = new Double(i);
soln 2) Double d = 2.0; Integer x = d.intValue();
Run Code Online (Sandbox Code Playgroud)


Vla*_*nov 5

指定你的标记:

List<Double> marks = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)

这称为泛型.

  • @Gray - 一个'整数'就够了;) (2认同)