ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
每次我尝试运行我的程序时,我都会收到一个 ClassCastException 声明:java.lang.Integer cannot be cast to java.lang.Double
ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
每次我尝试运行我的程序时,我都会收到一个 ClassCastException 声明:java.lang.Integer cannot be cast to java.lang.Double
我们可以将 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.
这显示了与您的运行时异常对应的编译时错误。
好吧,您显示的代码实际上并不包括将任何整数添加到ArrayList
- 但如果您确实知道您有整数,您可以使用:
sum = (double) ((Integer) marks.get(i)).intValue();
这会将其转换为int
,然后可以将其转换为double
. 您不能直接在盒装类之间进行转换。
请注意,如果您可以为您的 . 使用泛型ArrayList
,您的代码会更清晰。
问题中发布的代码显然不是一个完整的示例(它没有向数组列表添加任何内容,也没有i
在任何地方定义)。
首先,正如其他人所说,您需要了解原始类型和封装它们的类类型之间的区别。例如Integer
box int
、Double
box double
、Long
boxlong
等。Java 在各种场景中自动装箱和拆箱(以前您必须使用库调用手动装箱和拆箱,但这被认为是丑陋的 PITA)。
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
大多数情况下,您可以从一种原始类型转换为另一种(例外情况是boolean
),但不能对盒装类型执行相同的操作。将一种盒装类型转换为另一种要复杂一些。特别是如果您事先不知道盒子类型。通常它将涉及通过一种或多种原始类型进行转换。
因此,您的问题的答案取决于您的数组列表中的内容,如果它只是您可以执行的 Integer 类型的对象。
sum = ((double)(int)marks.get(i));
转换为int
将在幕后首先转换结果为marks.get
to Integer
,然后将拆箱该整数。然后我们使用另一个强制转换将原语转换为原int
语double
。Double
最后,结果将在分配给 sum 变量时自动装箱回 a 。(此外,在大多数情况下,将 sum 设为 type 可能更有意义double
) 。Double
如果您的数组列表包含多种类型,但它们都实现了Number
接口(Integer、Short、Long、Float 和 Double 都可以,但 Character 和 Boolean 没有),那么您可以这样做。
sum = ((Number)marks.get(i)).doubleValue();
如果混合中还有其他类型,那么您可能需要考虑使用instanceof
运算符来识别它们并采取适当的措施。
这里有两件事要理解-
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();
指定你的标记:
List<Double> marks = new ArrayList<Double>();
这称为泛型。
将整数更改为双精度
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”。请注意,该值尚未四舍五入,实际上已省略数据。
sum = Double.parseDouble(""+marks.get(i));
Integer x=10;
Double y = x.doubleValue();
这意味着您的 ArrayList 在某些元素中具有整数。除非您的元素之一中有整数,否则强制转换应该有效。
确保您的 arraylist 没有整数的一种方法是将其声明为 Doubles 数组。
ArrayList<Double> marks = new ArrayList<Double>();
我认为主要问题是您使用包装类进行强制转换,似乎它们是不兼容的类型。
但另一个问题是“i”是一个 int,所以你要转换最终结果,你也应该转换 i。还可以尝试使用关键字“double”来强制转换,而不是使用“Double”包装类。
你可以在这里查看:
希望这可以帮助。我发现该线程很有用,但我认为这有助于进一步澄清它。