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

每次我尝试运行我的程序时,我都会收到一个 ClassCastException 声明:java.lang.Integer cannot be cast to java.lang.Double

4

10 回答 10

55

我们可以将 an 强制int转换为 adouble但我们不能对包装类Integer和做同样的事情Double

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

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

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

于 2011-04-06T12:55:17.730 回答
35

好吧,您显示的代码实际上并不包括将任何整数添加到ArrayList- 但如果您确实知道您有整数,您可以使用:

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

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

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

于 2011-04-06T12:29:13.207 回答
11

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

首先,正如其他人所说,您需要了解原始类型和封装它们的类类型之间的区别。例如Integerbox intDoublebox doubleLongboxlong等。Java 在各种场景中自动装箱和拆箱(以前您必须使用库调用手动装箱和拆箱,但这被认为是丑陋的 PITA)。

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

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

因此,您的问题的答案取决于您的数组列表中的内容,如果它只是您可以执行的 Integer 类型的对象。

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

转换为int将在幕后首先转换结果为marks.getto Integer,然后将拆箱该整数。然后我们使用另一个强制转换将原语转换为原intdoubleDouble最后,结果将在分配给 sum 变量时自动装箱回 a 。(此外,在大多数情况下,将 sum 设为 type 可能更有意义double) 。Double

如果您的数组列表包含多种类型,但它们都实现了Number接口(Integer、Short、Long、Float 和 Double 都可以,但 Character 和 Boolean 没有),那么您可以这样做。

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

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

于 2015-01-06T18:41:42.237 回答
8

这里有两件事要理解-

1)如果您将 Primitiveinterger转换为 Primitive 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();
于 2017-07-09T13:41:13.177 回答
5

指定你的标记:

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

这称为泛型。

于 2011-04-06T12:29:41.080 回答
3

将整数更改为双精度

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

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

代码将整数“abc”输出为双精度数,这意味着它将显示为“12.0”。请注意如何有一个小数位,表明该精度数字已被存储。

如果你想把它改回来,和 double 一样,

double number=13.94;

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

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

于 2013-09-12T15:51:23.650 回答
2
sum = Double.parseDouble(""+marks.get(i));
于 2015-06-23T14:58:26.790 回答
1
Integer x=10;
Double y = x.doubleValue();
于 2019-02-20T10:08:48.273 回答
0

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

确保您的 arraylist 没有整数的一种方法是将其声明为 Doubles 数组。

    ArrayList<Double> marks = new ArrayList<Double>();
于 2013-04-29T18:56:40.117 回答
0

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

但另一个问题是“i”是一个 int,所以你要转换最终结果,你也应该转换 i。还可以尝试使用关键字“double”来强制转换,而不是使用“Double”包装类。

你可以在这里查看:

希望这可以帮助。我发现该线程很有用,但我认为这有助于进一步澄清它。

于 2017-01-25T19:16:13.577 回答