ClassCastException 整数加倍

ClassCastException Integer to Double

为什么这段代码抛出这个异常:

public class DS3{
    public static void main(String[] args) {
        double r = (double)((Object)4);
        System.out.println(r);          
    }   
}

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double

而这个 运行 很好:

public class DS4{
        public static void main(String[] args) {
            double r = (double)(4);
            System.out.println(r);          
        }   
    }

两者都是尝试将整数转换为双精度,对吗?

在您的第一个示例中,4 被自动装箱为 Integer,然后无法转换为原始类型 double

也许你想要的只是:

double r = 4;

Both are a attempt to convert integer to double, right?

是,也不是。

这一行

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.

第一次尝试将 4 转换为 Integer 类型的对象,它基本上是一个包含 int 值 4 的容器。

第二次尝试只是将 int 转换为 double,两者都是原始非对象类型。

不能将对象转换为基本类型。

您显示的两次转化,即

Object x = 4;
double r = (double)x;

double r = (double)(4);

需要不同的转化次数:

  • 第二次转换需要从 intdouble
  • 的单个转换
  • 第一次转换需要从 Object 进行拆箱转换,然后进行转换。

Java 转换运算符一次只执行一次转换。

要使第一个转换生效,您必须向 Integer 添加另一个转换,像这样 (demo):

double r = (double)((Integer)((Object)4));
System.out.println(r);

您的问题是关于装箱和拆箱的。您可以在此处阅读更多相关信息:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html