ClassCastException Integer to Double

时间:2015-03-30 14:02:46

标签: java

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

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

5 个答案:

答案 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);

需要不同数量的转化:

  • 第二次转化需要从intdouble
  • 的单一演员表
  • 第一次转换需要从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