为什么此代码引发此异常:
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
线程“主”中的异常java.lang.ClassCastException:java.lang.Integer无法转换为java.lang.Double
而且,运行正常:
public class DS4{
public static void main(String[] args) {
double r = (double)(4);
System.out.println(r);
}
}
都是试图将整数转换为双精度,对吗?
都是试图将整数转换为双精度,对吗?
是,不是。>>
此行
double r = (double)((Object)4);
使编译器将
4
装在Integer
中,并且Integer
不能转换为双精度。
此代码段的字节码:
(double)((Object) 4)
如下所示:
// ... 5: iconst_4 6: invokestatic #2 // Method Integer.valueOf 9: checkcast #3 // class java/lang/Double // ...
((第6行导致装箱,第9行引发异常。)
换句话说,相当于
Object tmp = (Object) 4; // Auto-boxing to Integer double d = (double) tmp; // Illegal cast from Integer to double.
另一方面
强制转换为double r = (double)(4);
4
被认为是普通的int
,将其[[can
double
。4
被自动装箱到Integer
,然后无法将其强制转换为原始double
。Integer
的对象,该对象基本上是保存int
值为4的容器。