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 を回避できます。


