为什么此代码会抛出此异常:
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
线程“main”中的异常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,对吗?
答案 0 :(得分:7)
两者都是尝试将整数转换为double,对吗?
是的,没有。
这一行
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
,可以投放到double
。
答案 1 :(得分:2)
您展示的两次转化,即
Object x = 4;
double r = (double)x;
和
double r = (double)(4);
需要不同数量的转化:
int
到double
,Object
进行拆箱转换,然后进行转换。Java强制转换操作符一次只执行一次转换。
要进行第一次转换,您必须向Integer
添加另一个转换,例如demo}:
double r = (double)((Integer)((Object)4));
System.out.println(r);
答案 2 :(得分:1)
在您的第一个示例中,4
被自动装箱到Integer
,然后无法将其转换为原始double
。
也许你想要的只是:
double r = 4;
答案 3 :(得分:1)
第一次尝试将4转换为Integer
类型的对象,该对象基本上是一个容器,其int
值为4.
第二次尝试只是将int
转换为double
,两者都是原始的非对象类型。
您无法将对象转换为基本类型。
答案 4 :(得分:1)
你的问题是拳击和拆箱。您可以在此处详细了解:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html