-1
public class Test8 {
   public static void main (String args[]) {
      Number numberRef = new Integer(0);
      Double doubleRef = (Double)numberRef;
   }
}

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

线程“主”java.lang.ClassCastException 中的异常:
  java.lang.Integer 不能转换为 java.lang.Double

为什么会这样?

4

3 回答 3

4

您正在尝试将实例转换为不可能发生Integer的引用。并且是两个不同的类和对象不能简单地相互转换DoubleIntegerDouble

Number是and的公共super类,因此or的实例可以向上转换为 . 换句话说,IS A , IS A BUT, IS NOT AIntegerDoubleDoubleIntegerNumberInteger NumberDouble NumberInteger Double

Integer i = new Integer(0);
Double d = new Double(1);
Number ni = i;
Number di = d;
Integer id = d; //invalid;
Double dd = i; //invalid
于 2013-07-22T03:10:10.717 回答
2

您收到ClassCastException符合JLS §5.5.3 的

这是检查R对象的运行时类型是否与类型兼容的算法,该类型T是强制转换运算符中命名的类型的擦除(第 4.6 节)。如果抛出运行时异常,则为ClassCastException.

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

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

  • ...

...

请注意,Integer不是.Double


关于什么

Double doubleRef = numberRef.doubleValue();

反而?

doubleValue()Number类的方法。

于 2013-07-22T03:10:48.387 回答
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

于 2013-07-22T03:29:42.707 回答