2016-05-22 8 views
1

Javaクラスキャストに関する幅広い質問があります。私が4つのクラス(よく3つのクラスと1つのインターフェイス)を作成したとしましょう。インターフェイスAはあなたが言うことができると思うスーパーインターフェイスです。クラスBはA(インターフェイスAのサブクラスであることを意味します)を実装し、CはBとDこれらの製作のオブジェクトが実際にコンパイルされている場合はJavaクラス/オブジェクトキャスティング適用可能な場合

A myA; 
B myB = new B(); 
C myC = new C(); 
D myD = new D(); 

//I want to cast now! 

myB = (B) myD; 
myC = (D) myA; 
myD = (C) myB; 

:C.

だが、私は以下のように、次の初期化したドライバクラスを持っているとしましょう拡張?私は、キャスティングの間のルールを理解するのに苦労しています。私はある種のダウンキャスティングとそれが許されない方法を理解していますが、クラスキャスティングはまだ私を混乱させるようなコンセプトです。

答えて

2

親指の規則は、オブジェクトBがタイプAであれば、それをAにキャストすることができるということです。例BではAが実装されているので、BはA型です。 Bを拡張し、CはA型の型だけでなくB型のものです。したがって、CオブジェクトはAまたはBにキャストできます。

0

はコメントとして追加したい、しかし、限定だって、答えとして、それを追加する必要がありました:

1)ルールの子供は親が持っているものの父/継承し、その逆はできませんです。 2)子は親として保存できますが、逆はできません。

これはmyD =(C)myABになります。 MYDは、(Bを拡張 - > A)C延びるにつれて、互換性のない

をあなたは

B myB = new B(); 

を作成するとき、私は非技術的な用語で説明しようとするので、その後、MYBはBとAについてのすべてを知っているが、それ何が下にあるのか分からない。それは、階層の上のそれ以上のものでそれ自身を見ることができます:

A 
    B 
    C 
    D 

したがって、最も低い1つのDは、その上にあるものにキャストすることができます。

1)myB =(B)myD;上記ルー​​ル状態に

は、DがB以下である、したがって、Bに割り当てることができる

2)MYC =(D)MYA。 ここではDへのインターフェイスをキャストしているため、コンパイル時にDをトップレベルCに割り当てることができます。

3)ここでmyB(コンパイル時にCに型キャストされます)コンパイル時には(Dのインスタンスが階層の下位にありますが)コンパイルしているときは、実行時インスタンスを使用できません。したがって、以下は失敗します:

myD =(C)myB;

私はここでさらにあなたを混乱させていないと思います。

+0

私はまだ少し混乱していますが、実際には、階層の下位のクラスは親クラス(またはスーパークラス)に関するすべてを知っていますが、親クラスは子クラスについて何も知らないためキャストできません。 myD =(C)myBの場合;それはまだCにキャストされていません。私はちょうどこれのすべてで混乱しています、それだけです。ありがとう! – Linuxn00b

+1

Woho、そして何人かのスマートな男が否定的な答えを何の説明もしていないと投票しました:) – Optional

+0

Yah私はなぜそれがよい答えだと思ったのかわかりません。 – Linuxn00b

関連する問題