1

ChildClass に継承される ParentClass に継承される GrandParentClass があるとします。

「チェーンのアップ」しかキャストできないのに、ダウンはキャストできないのはなぜですか?

ダイナミック バインドは「ダウン チェーン」のみで、アップはできないのはなぜですか?

パターンを暗記するだけでなく、これらの質問に適用できる理由を探しています。これが単なる「その通りだ」というような答えではないことを心から願っています。

鋳造の例:

ParentClass object = new ParentClass();
System.out.println((GrandParentClass)object);  //casting ChildClass throws compiler error 

動的バインディングの例:

GrandParentClass = new ChildClass(); //Switching GrandParentClass with ChildClass throws run time error.
4

4 に答える 4

2

動物と考えるとわかりやすいかもしれません。祖父母クラスがAnimal、親クラスがDog、子クラスが であるとしましょうGermanShepherd

最初の例は次のようになります。

Dog dog = new Dog();
System.out.println((Animal)dog);  
//casting GermanShepherd throws compiler error

犬はいつでも動物であることができますが、犬は常にジャーマン シェパードであるとは限りません (プードルである可能性があります)。

2番目の例:

Animal animal = new GermanShepherd(); 
//Switching Animal with GermanShepherd throws run time error.

同様に、ジャーマン シェパードは常に動物ですが、動物はジャーマン シェパードではない場合があります (カメの場合もあります)。

于 2013-04-29T02:26:11.177 に答える