1

親を子にダウンキャストするときに java.lang.ClassCastException が発生する理由を誰か説明してもらえますか?

public class Child extends Parent{
public static void main(String[] args){
    new Child().go();
}
void go(){
    go2(new Parent(), new Child());
    go2((Child) new Parent(), new Child());
}
void go2(Parent p1, Child c1){
    Child c2 = (Child)p1;
    Parent p2 = (Parent)c1;
} 
}
class Tree{}

参照変数のキャストを読み、Web で例を検索しました。誰か説明してくれませんか?例外をスローする理由を本当に理解したいです。ありがとう

4

6 に答える 6

2

問題のあるコードが削除されたのは次のとおりです。

go2(new Parent());

...

void go2(Parent p1){
    Child c2 = (Child)p1;
}

コンパイラは、p1 が「子」になる可能性があるため、「親」から「子」への p1 のキャストを許可します。ただし、p1 が子ではないことは明らかです。したがって、コードはコンパイル時には問題ありませんが、実行時にクラッシュします。

つまり、タイプ「親」のインスタンスしかないため、「子」クラスで定義した追加の動作はすべて利用できません。

于 2013-05-09T09:26:04.860 に答える
0

AParentは ではありませんChild。つまり、 aParentには、 のインスタンスであるかのように扱われ、すべての特定のメソッド ( のコントラクト) をChild満たすために必要なフィールドがあります。変数とメソッドがあり、メモリ内にあるオブジェクトを呼び出そうとしたとします。うまくいかない可能性があるため、Java では親を子として扱うことができません。ChildChildChildchildOnlychildProcesschildProcessParent

于 2013-05-09T09:25:51.913 に答える
0

多相参照のため、sub-typeオブジェクトを格納してsuper-type参照する場合、 固有のメソッドを使用することはできませんsub-type。で定義されているメソッドを取得できますsuper-type

サブタイプのメソッドを使用できるようにするには、への参照をキャストする必要がありsuper-typeますsub-type

Parent p = new Child();
...
...
((Child)p).childMethod();

pただし、これは、割り当てられたオブジェクトが実際にタイプであることがわかっている場合にのみ可能ですChild。そうでなければそれは与えるでしょうClassCastException

于 2013-05-09T09:28:07.073 に答える
0

Carベアボーンインターフェースだとしましょう

Merc is a Car (Merc extends Car)

BMW  is a Car (BMW extends Car)

つまり、BMW を車のすべての機能として、BMW として扱うことができます。BMWを車にキャストできるので(Car car = (Car)bmw) 合法です。

ベアボーンカーをBMWとして扱おうとすると、BMWはベアボーンカー以上のものを持っているため、それはできません。

それで、

BMW bmw = (BMW)car 違法です

同じ現実世界の概念がオブジェクト指向の世界に拡張されます。

于 2013-05-09T09:31:49.707 に答える