ClassCastException Integer to Double

Mai*_*ret 3 java

为什么此代码会抛出此异常:

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,对吧?

aio*_*obe 7

两者都是尝试将整数转换为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.


das*_*ght 5

您显示的两个转换,即

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)