0

私はこれを検索しましたが、まだ混乱しています。

以下は、スタンダード クラスのキャスティングの例です。

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

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 にキャストできません。


したがって、2 番目のものを 1 番目のものと同じにしたい場合は、次のコードを使用します。

H  h = new I();
于 2013-10-30T07:12:47.303 に答える
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 is not dog と同じです)。

于 2013-10-30T07:03:32.673 に答える
1

Integer 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;

デフォルトでは、数値参照に割り当てられた値は int 型として扱われます。 値を long に割り当てると、上記のコードはコンパイルされます。

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

ないので、あなたは私を作成する必要がありInew H()あなただけがキャストできます。

これを試してみてください。

   H h = new I();
   I i = (I)h;
于 2013-10-30T07:05:07.770 に答える
0

番号 b = 10; Number と同じ b = new Integer(10) Integer は Number のサブクラスです。あなたの例では H は I のサブクラスではありません

于 2013-10-30T07:04:41.873 に答える