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,您的代码将更清晰.
小智 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运算符来识别它们并采取适当的措施.
这里要理解的两件事 -
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)
指定你的标记:
List<Double> marks = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)
这称为泛型.
| 归档时间: |
|
| 查看次数: |
135631 次 |
| 最近记录: |