Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这会导致ClassCastException?_Java - Fatal编程技术网

Java 为什么这会导致ClassCastException?

Java 为什么这会导致ClassCastException?,java,Java,它在运行时向我显示异常: public class Test8 { public static void main (String args[]) { Number numberRef = new Integer(0); Double doubleRef = (Double)numberRef; } } 线程“main”java.lang.ClassCastException中的异常: 无法将java.lang.Integer转换为java.lang.Dou

它在运行时向我显示异常:

public class Test8 {
   public static void main (String args[]) {
      Number numberRef = new Integer(0);
      Double doubleRef = (Double)numberRef;
   }
}
线程“main”java.lang.ClassCastException中的异常: 无法将java.lang.Integer转换为java.lang.Double
为什么会这样?

您试图将
Integer
的实例强制转换为引用
Double
,这是不可能发生的
Integer
Double
是两个不同的类,每个类的对象不能简单地相互转换

Number
Integer
Double
的常见
super
类,因此
Double
Integer
的实例可以是
Number
。换句话说,
整数
数字
双精度
数字但是,
整数
双精度

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
您收到的
ClassCastException
符合以下条件:

下面是检查对象的运行时类型
R
是否与类型
T
兼容的算法,该类型是在cast运算符中命名的类型的擦除()。如果抛出运行时异常,则它是一个
ClassCastException

如果
R
是普通类(不是数组类):

  • 如果
    T
    是类类型,则
    R
    必须是与
    T
    相同的类(),或者是
    T
    的子类,否则会引发运行时异常。

请注意,它不是的子类


那怎么办

Integer i = new Integer(0);
Double d = new Double(1);
Number ni = i;
Number di = d;
Integer id = d; //invalid;
Double dd = i; //invalid
相反


是类的一个方法。

numberRef.doubleValue()
将返回整数的双精度值,然后可以将该值分配给双精度值

文件-


因为
Integer
不是
Double
的子类?是的,不能将
Integer
强制转换为
Double
。下面的arshajii给出了正确的答案,使用
doubleValue()
。还值得一提的是整数和int、Double和Double是不同的东西。一些初学者倾向于认为强制转换是某种转换,但事实并非如此。Casting只是告诉编译器“不,你认为这个对象可能不是这个类的实例,但我可以向你保证它会是,所以无论如何都要编译它”。不用说,当对象在运行时不是您所说的类的实例时,就会引发运行时异常。
Double doubleRef = numberRef.doubleValue();