0

我一直在寻找这个仍然有一个困惑。

以下是Standered Class的铸造示例

public class Q {
  public static void main(String... str){
    Number b = 10;
    Integer i = (Integer)b; // Workes Fine
  }           
}

下面是用户定义类的转换示例

class H{}

class I extends H{}

public class Q extends I{
   public static void main(String... str){
     I i = (I)new H(); //Show runtime java.lang.ClassCastException
   }           
}

上面是继承的例子。这样:

  1. 整数扩展数
  2. I 扩展 H

为什么 Integer i = (Integer)b 有效而 I i = (I)new H() 无效?

4

6 回答 6

4

因为new H()创建了一个H既不是I也不I是子类的对象,所以它不能被强制转换为I.

虽然Number b在第一个例子中是一个Integer - 那里是隐含的new Integer(10)Number是一个抽象类),所以它显然可以转换为Integer.

于 2013-10-30T07:01:40.853 回答
1
Number b = 10;
Integer i = (Integer)b; // Workes Fine

在这种情况下,您告诉 java 编译器相信我 b 是一个整数(在运行时),它实际上是(10 是一个整数)。

I i = (I)new H(); //Show runtime java.lang.ClassCastException

您是在告诉编译器 H 是 I,这是不正确的(与 Animal 不是 dog 相同)。

于 2013-10-30T07:03:32.673 回答
1

没有Iinnew H()所以你需要创建 I 然后只有你可以施放。

试试这个。

   H h = new I();
   I i = (I)h;
于 2013-10-30T07:05:07.770 回答
1

为什么整数 i = (Integer)b 有效

这可以正常工作,因为该语句Number b = 10;被隐式转换为Number b = new Integer(10);因此上述转换工作正常。

如果您想对此进行测试,只需尝试以下代码:

Number n = 12342444444; // Wont compile: Expects the literal to in the range of int
Integer i = (Integer) n;

默认情况下,分配给 Number 引用的值被视为 int 类型。 如果您将值赋值为 long,则上述代码将编译。

Number n = 12342444444L; // Will compile
Integer i = (Integer) n; // ClassCastExcpetion: Cannot cast Long to Integer 
于 2013-10-30T07:10:46.703 回答
1

在第一次的情况下。

Number b = 10;
Integer i = (Integer)b; // Workes Fine

它更像

Number b = new Integer(10); // because 10 in int and it autobox to Integer.
Integer i = (Integer)b; 

但另一方面。

 I i = (I)new H(); //Show runtime java.lang.ClassCastException

它创建类的对象H并尝试将其转换为I但 H 不是 I 的子类,因此不能将其转换为 I。


因此,如果您希望第二个等于第一个,请使用以下代码:

H  h = new I();
于 2013-10-30T07:12:47.303 回答
0

数字 b = 10; 与 Number b = new Integer(10) 相同 Integer 是 Number 的子类。虽然在您的示例中 H 不是 I 的子类

于 2013-10-30T07:04:41.873 回答