[英]ClassCastException, casting Integer to Double
ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
每次我尝试运行我的程序时,都会遇到一个ClassCastException:java.lang.Integer无法强制转换为java.lang.Double
我们可以将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.
这显示了与运行时异常相对应的编译时错误。
嗯,你已经证明实际上不包括添加任何整数到代码ArrayList
-但如果你知道你有整型,你可以使用:
sum = (double) ((Integer) marks.get(i)).intValue();
这会将它转换为int
,然后可以将其转换为double
。 你不能直接在盒装类之间投射。
请注意,如果您可以为ArrayList
使用泛型,那么您的代码将更加清晰。
问题中发布的代码显然不是一个完整的例子(它没有向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));
cast to int
将在幕后首先将marks.get
的结果marks.get
为Integer
,然后将unbox整数。 然后我们使用另一个强制转换将原始int
转换为原始double
。 最后,当将结果分配给sum变量时,结果将自动退回到Double
。 (请注意,在大多数情况下,总和可能更有意义的是double
类型而不是Double
类型)。
如果您的arraylist包含多种类型的混合,但它们都实现了Number
接口(Integer,Short,Long,Float和Double都可以,但不包括Character和Boolean),那么你可以这样做。
sum = ((Number)marks.get(i)).doubleValue();
如果混合中还有其他类型,那么您可能需要考虑使用instanceof
运算符来识别它们并采取适当的操作。
这里要理解的两件事 -
1)如果要将Primitive interger
为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>();
这称为泛型。
将整数更改为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”。 请注意,该值尚未向上舍入,实际上已省略了数据。
sum = Double.parseDouble(""+marks.get(i));
Integer x=10;
Double y = x.doubleValue();
这意味着您的ArrayList在某些元素中具有整数。 除非你的一个元素中有一个整数,否则转换应该有效。
确保你的arraylist没有整数的一种方法是将它声明为双打数组。
ArrayList<Double> marks = new ArrayList<Double>();
我认为主要的问题是你使用包装类进行转换,似乎它们是不兼容的类型。
但另一个问题是“i”是一个int,所以你要投出最终结果,你也应该投我。 另外尝试使用关键字“double”来强制转换而不是“Double”包装类。
你可以在这里查看:
希望这可以帮助。 我发现该线程很有用,但我认为这有助于进一步澄清它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.