class Animal {
void makeSound() {
System.out.println("Generic animal sound");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Woof! Woof!");
}
}
public class Main {
public static void main(String[] args) {
// Animal クラスのオブジェクトを作成
Animal animal = new Animal();
// Animal クラスのオブジェクトを Dog クラスにダウンキャスト
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
// ダウンキャスト後、Dog クラスの特有のメソッドを呼び出す
dog.bark();
} else {
System.out.println("Animal is not a Dog");
}
}
}
この例では、まず Animal
クラスのオブジェクトを作成し、instanceof
演算子を使用してそのオブジェクトが Dog
クラスのインスタンスであるかを確認しています。もし Dog
クラスのインスタンスであれば、そのオブジェクトを Dog
クラスにダウンキャストして、bark
メソッドを呼び出しています。ダウンキャストが成功しない場合には、適切なメッセージが表示されます。
ポリモーフィズムにおけるダウンキャスト
ポリモーフィズムにおけるダウンキャストは、親クラス型の変数を子クラス型の変数に変換する操作です。これにはいくつかのポイントがあります。
- アップキャストの前提条件:
- ダウンキャストを行う前に、元々のオブジェクトがダウンキャスト先のクラスのインスタンスであることを確認するために
instanceof
演算子が利用されます。 instanceof
演算子は、左辺のオブジェクトが右辺のクラスのインスタンスであればtrue
を返し、そうでなければfalse
を返します。
- ダウンキャストを行う前に、元々のオブジェクトがダウンキャスト先のクラスのインスタンスであることを確認するために
- ClassCastException の回避:
- アップキャストが成功するとは限らないため、ダウンキャスト時には
instanceof
を使用して確認し、適切なキャストができるかを確認する必要があります。 - ダウンキャストを試みた結果が
true
の場合にのみダウンキャストを行い、そうでない場合はClassCastException
を回避するためにエラーハンドリングが必要です。
- アップキャストが成功するとは限らないため、ダウンキャスト時には
解答例ではinstanceof
演算子を使用して animal
オブジェクトが Dog
クラスのインスタンスであるかを確認し、その後でダウンキャストを行っています。これにより、ダウンキャスト時に発生する可能性のある ClassCastException
を回避できます。