public class Test8 {
public static void main (String args[]) {
Number numberRef = new Integer(0);
Double doubleRef = (Double)numberRef;
}
}
它在运行时显示异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
为什么会这样?
答案 0 :(得分:4)
您正在尝试将Integer
的实例强制转换为引用Double
,这是不可能发生的。 Integer
和Double
是两个不同的类,每个类的对象不能简单地相互投射
Number
是super
和Integer
的常见Double
类,因此Double
或Integer
的实例可以是 upcasted 到Number
。换句话说,Integer
IS A Number
,Double
IS A Number
但是,Integer
IS NOT A {{1 }}
Double
答案 1 :(得分:2)
您收到的ClassCastException
符合JLS §5.5.3:
这是一个算法,用于检查对象的运行时类型
R
是否与类型为T
的赋值兼容,该类型是在名称中指定的类型的擦除(§4.6)演员。如果抛出运行时异常,则为ClassCastException
。如果
R
是普通类(不是数组类):
如果
T
是类类型,那么R
必须是与T
相同的类(§4.3.4)或T
的子类{1}}或抛出运行时异常。...
...
怎么样?
Double doubleRef = numberRef.doubleValue();
代替?
doubleValue()
是Number
类的方法。
答案 2 :(得分:0)
numberRef.doubleValue();
将返回Integer的double值,然后可以将其赋值给Double
文档 -
http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html