導入
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… 変数a(Animal型)をDog型として扱えるようにキャストします。これでDog独自のメソッドfetch()が呼べるようになります。- 必ず
instanceofで確認してからキャストしましょう。本物のJavaでは、実体と違う型へ無理やりキャストしようとすると、実行時にClassCastExceptionというエラーが発生します。「型を確認してからキャストする」という順番を守ることで、これを防げます。
やってみよう
下のエディタで instanceof のチェックを外すとどうなるか(Dog 以外が入っていた場合に fetch() が呼べずエラーになりうる)を考えてみましょう。安全にダウンキャストするには、必ず instanceof とセットで使うことを覚えておいてください。
演習
Bird extends Animal に fly() メソッド("飛んでいった" と表示)を追加してください。main で Animal a = new Bird(); を作り、instanceof で Bird かどうか確認してからダウンキャストし、fly() を呼んでください。
ヒント1を見る
class Bird extends Animal { void fly() { System.out.println("飛んでいった"); } }。
ヒント2を見る
if (a instanceof Bird) { Bird b = (Bird) a; b.fly(); }。