Java ClassCastException整数到双精度

Java ClassCastException整数到双精度,java,classcastexception,Java,Classcastexception,此代码引发此异常的原因: 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 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);          
        }   
    }

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

在第一个示例中,
4
自动装箱为
整数
,然后不能将其转换为原语
双精度

也许你想要的只是:

double r = 4;
两者都是试图将整数转换为双精度,对吗

是的,也不是

这条线

double r = (double)((Object)4);
使编译器将
4
框入
整数
,并且
整数
不能转换为双精度

此代码段的字节码:

(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;

需要不同数量的转换:

  • 第二次转换需要从
    int
    double
    的单次转换
  • 第一次转换需要从
    对象
    进行取消装箱转换,然后进行强制转换
Java cast运算符一次只执行一个转换

要进行第一次转换,必须向
Integer
添加另一个强制转换,如下():


你的问题是装箱和拆箱。您可以在此处了解更多信息:

4
自动装箱为
Integer
,不能强制转换为
double
。作为提示,
4
也可以是double而不强制转换。您可以将
对象强制转换为基本类型,只要它是正确的类型<代码>对象o=1;int a=(int)o有效。最好不要将对象强制转换为基本体。违背了使用对象的目的。
double r = (double)(4);
double r = (double)((Integer)((Object)4));
System.out.println(r);