Java 多態のダウンキャストはどうやって実装するか
Javaでは、ダウンスキャストは明示的なキャスト演算子((サブクラス型) スーパーオブジェクト)を使用して、親オブジェクトをサブオブジェクト型に変換します。
例えば、親クラスである Animal と子クラスである Dog があります。
public class Animal {
public void eat() {
System.out.println("Animal is eating...");
}
}
public class Dog extends Animal {
public void eat() {
System.out.println("Dog is eating...");
}
public void bark() {
System.out.println("Dog is barking...");
}
}
今、Animalオブジェクトを作成し、それをDogオブジェクトにダウンキャストします。
Animal animal = new Dog();
Dog dog = (Dog) animal;
こうして animal オブジェクトは Dog 型のオブジェクト dog へとダウンキャストされる。その後、Dog クラスに固有のメソッドを呼び出すことができるようになる。
dog.eat(); // 输出:Dog is eating...
dog.bark(); // 输出:Dog is barking...
親クラスオブジェクトをそれとは関係のないサブクラスオブジェクトにダウンキャストしようとするとClassCastException例外がスローされることに注意してください。そのために、インスタンスオブジェクトをダウンキャストする前にinstanceof演算子を使用して、オブジェクトがその型のインスタンスに変換可能かどうかをチェックするのが良いでしょう。
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
} else {
System.out.println("animal cannot be cast to Dog");
}