2015-01-03 17 views
5

にキャスティング場合:のJava(インタフェースおよびクラス)

interface I{} 

class A implements I{} 

class B extends A{} 

class C extends B{} 

A a = new A(); 
B b = new B(); 

Why a = (B)(I)b; is correct 
but b = (B)(I)a; is false? 

私は非常に混乱することにキャスト見つけ、私はキャストをダウンすることができますかアップオブジェクトをキャストした場合に理解するための最良の方法は何ですか?

+4

のタイプではありませんか?あなたが '私 'の言葉をすべて削除した場合、' a =(B)b; 'と' b =(B)a; –

+0

@JonSkeetこれはJavaの試験問題です。なぜ彼らがInterface "I"をキャストするのかがとても混乱しています。 – OPK

+0

両方のキャストは正しいです(実行時にコンパイルしても失敗しなくても)。具体的には、Java 7以上でコンパイルできないものは何ですか? – Makoto

答えて

1

あなたのクラス階層は次のようになります。

C -> B -> A -> I

xの実行時の型がYのサブクラスである場合xは、クラスYにキャストできるオブジェクト。つまり、ランタイムタイプxからYまでのパスが存在するかどうかを判断します。 「ランタイム型」とは、変数の型(変数宣言からの型)とは対照的に、オブジェクトの型(オブジェクトを構築するときに使用される型)を意味します。

これは有効です。bに保存されている

b = new B(); 
(B)(I)b; 

オブジェクトがBを入力しています。それはIにキャストされ、次にBに戻ります。 Bは、両方のサブクラスです。 Iへのキャストは実際には何もしません。あなたを混乱させるだけのものです。

しかし、それらのいずれも有効です。java.lang.ClassCastException: A cannot be cast to B

a = new A(); 
(B)(I)a; 
(B)a; 

は、彼らは両方の例外で失敗します。 aのタイプはAであり、Bのサブクラスではありません。 ABの間には関係がありますが、逆方向です。BAのサブクラスです。

より詳細な説明についてはこちらをご覧ください:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

1

あなたのコーディングサンプルで質問に答えるとの関連性の唯一のものを以下に示します。

class B extends A{} 

これは、BがAのサブクラスであることを意味しサブクラスはスーパークラス型にキャストできますが、スーパークラスはサブクラス型にキャストできません。

したがって、Aは

なぜB.を型にキャストすることはできませんか?ロジックについてこのように考える:

enter image description hereProgramming_languageのタイプですが、あなたはすべてのI` `にキャストされているのはなぜProgramming_languageenter image description here

関連する問題