- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ダウンキャストできません)
ダウンキャストできません
このQ&Aのポイント
- 参照型の縮小変換(ダウンキャスト)したいのですが、できません。
- コンパイルは成功するのですが、実行すると最後の方にException in ~という風にエラーがでてしまいます。
- RobotPet q=(RobotPet)new Pet("ドラえもん","のび太");の部分でダウンキャストできてない?みたいなのですが、どうしたらダウンキャストできるのでしょうか?
- みんなの回答 (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; // これは例外が発生する
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
ソースは見てないけど, それを「ダウンキャスト」と呼んでるということは 「RobotPet は Pet のサブクラス」 ってこと? もしそうなら, それは失敗して当然. むしろ, この「ダウンキャスト」が成功すると思う方がおかしい.
質問者
補足
>>「RobotPet は Pet のサブクラス」ってこと? 4行目に書いてある通り、そうです。 参考書には「このようにキャスト演算子を明示的に適用すればダウンキャストは可能です。」と書いてあるので。
補足
>>ダウンキャストできるのはPet型の変数にRobotPet型のインスタンスが代入されていた場合だけです。 >>Pet p; >>RobotPet q; >>p = new RobotPet(…); >>q = (RobotPet)p; // これはOK これがダウンキャストだったのですね。 nedan属性なしでもできなくて、 参考書では RobotPet q=(RobotPet)new Pet("Kurt","アイ");でダウンキャスト可能ってあったのですが、 やっぱりこれおかしいですよね…? 有難うございました。