为什么此代码会抛出此异常:
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
Run Code Online (Sandbox Code Playgroud)
线程"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);
}
}
Run Code Online (Sandbox Code Playgroud)
两者都是尝试将整数转换为double,对吧?
两者都是尝试将整数转换为double,对吧?
是的,不.
这条线
double r = (double)((Object)4);
Run Code Online (Sandbox Code Playgroud)
导致编译器4在一个框中Integer,并且一个Integer不能强制转换为double.
此代码段的字节代码:
(double)((Object) 4)
Run Code Online (Sandbox Code Playgroud)
看起来如下:
// ...
5: iconst_4
6: invokestatic #2 // Method Integer.valueOf
9: checkcast #3 // class java/lang/Double
// ...
Run Code Online (Sandbox Code Playgroud)
(第6行导致拳击,第9行引发异常.)
换句话说,它相当于
Object tmp = (Object) 4; // Auto-boxing to Integer
double d = (double) tmp; // Illegal cast from Integer to double.
Run Code Online (Sandbox Code Playgroud)
另一方面,这里
double r = (double)(4);
Run Code Online (Sandbox Code Playgroud)
4被视为一个普通的int,可以铸成一个double.
您显示的两个转换,即
Object x = 4;
double r = (double)x;
Run Code Online (Sandbox Code Playgroud)
和
double r = (double)(4);
Run Code Online (Sandbox Code Playgroud)
需要不同数量的转换:
int第二次转换需要从 an到 a 的单次转换double,Object然后进行强制转换。Java 强制转换运算符一次仅执行一次转换。
要使第一次转换工作,您必须添加另一个转换Integer,如下所示(演示):
double r = (double)((Integer)((Object)4));
System.out.println(r);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7664 次 |
| 最近记录: |