本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第4章 多態性 ― 同じ呼び方で、違う動きをする · レッスン15

ダウンキャスト ― 親型から子型に戻す

ブラウザで完結

導入

instanceof で「これは Dog だ」とわかっても、変数型は Animal のまま なので、Dog だけが持つ独自のメソッドはまだ呼べません。子クラス固有のメソッドを呼ぶには、ダウンキャスト(親の型から子の型への型変換)が必要です。

説明

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        if (a instanceof Dog) {
            Dog d = (Dog) a;   // ダウンキャスト
            d.fetch();
        }
    }
}

class Animal {}

class Dog extends Animal {
    void fetch() {
        System.out.println("ボールを取ってきた");
    }
}
  • (Dog) a … 変数 aAnimal 型)を Dog 型として扱えるようにキャストします。これで Dog 独自のメソッド fetch() が呼べるようになります。
  • 必ず instanceof で確認してからキャストしましょう。本物のJavaでは、実体と違う型へ無理やりキャストしようとすると、実行時に ClassCastException というエラーが発生します。「型を確認してからキャストする」という順番を守ることで、これを防げます。

やってみよう

下のエディタで instanceof のチェックを外すとどうなるか(Dog 以外が入っていた場合に fetch() が呼べずエラーになりうる)を考えてみましょう。安全にダウンキャストするには、必ず instanceof とセットで使うことを覚えておいてください。

演習

Bird extends Animalfly() メソッド("飛んでいった" と表示)を追加してください。mainAnimal a = new Bird(); を作り、instanceofBird かどうか確認してからダウンキャストし、fly() を呼んでください。

ヒント1を見る

class Bird extends Animal { void fly() { System.out.println("飛んでいった"); } }

ヒント2を見る

if (a instanceof Bird) { Bird b = (Bird) a; b.fly(); }

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。