アプリ版:「スタンプのみでお礼する」機能のリリースについて

参照型の縮小変換(ダウンキャスト)したいのですが、できません。

◇私はロボット。名前はR2D2。値段は1000です。
◇ご主人様はルーク。

◇私はロボット。名前はR2D2。値段は1000です。
◇ご主人様はルーク。
Exception in thread "main" java.lang.ClassCastException: Pet
at PetTester1.main(PetTester1.java:15)

コンパイルは成功するのですが、
実行すると最後の方にException in ~という風にエラーがでてしまいます。
実行ファイルの
RobotPet q=(RobotPet)new Pet("ドラえもん","のび太");
の部分でダウンキャストできてない?みたいなのですが、どうしたらダウンキャストできるのでしょうか?

よろしくお願いします。

A 回答 (2件)

new Pet(…)で作ったものはPet型のインスタンスなので、どうやってもRobotPet型にはキャストできません。

もしそんなことができてしまうなら、RobotPetだけが持っているnedan属性はどこから与えられるのでしょうか?

Javaでは変数とインスタンスのそれぞれに型があることを意識してください。
・Pet型の変数には、Pet型のインスタンスとRobotPet型のインスタンスのどちらも代入できる
・RobotPet型の変数にはRobotPet型のインスタンスは代入できるがPet型のインスタンスは代入できない
ダウンキャストできるのはPet型の変数にRobotPet型のインスタンスが代入されていた場合だけです。
Pet p;
RobotPet q;
p = new RobotPet(…);
q = (RobotPet)p; // これはOK
p = new Pet(…);
q = (RobotPet)p; // これは例外が発生する

この回答への補足

>>ダウンキャストできるのはPet型の変数にRobotPet型のインスタンスが代入されていた場合だけです。
>>Pet p;
>>RobotPet q;
>>p = new RobotPet(…);
>>q = (RobotPet)p; // これはOK

これがダウンキャストだったのですね。

nedan属性なしでもできなくて、
参考書では
RobotPet q=(RobotPet)new Pet("Kurt","アイ");でダウンキャスト可能ってあったのですが、
やっぱりこれおかしいですよね…?

有難うございました。

補足日時:2011/06/04 10:37
    • good
    • 1

ソースは見てないけど, それを「ダウンキャスト」と呼んでるということは


「RobotPet は Pet のサブクラス」
ってこと? もしそうなら, それは失敗して当然. むしろ, この「ダウンキャスト」が成功すると思う方がおかしい.

この回答への補足

>>「RobotPet は Pet のサブクラス」ってこと?
4行目に書いてある通り、そうです。

参考書には「このようにキャスト演算子を明示的に適用すればダウンキャストは可能です。」と書いてあるので。

補足日時:2011/06/04 04:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!