为什么会导致ClassCastException?

时间:2013-07-22 03:08:12

标签: java

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

为什么会这样?

3 个答案:

答案 0 :(得分:4)

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

NumbersuperInteger的常见Double类,因此DoubleInteger的实例可以是 upcasted Number。换句话说,Integer IS A NumberDouble 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}}或抛出运行时异常。

  •   
  • ...

  •   
     

...

请注意,Integer 不是 Double的子类。


怎么样?
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