sealed のサブクラスをさらに制限
出力はどれか。
public class Main {
public static void main(String[] args) {
Animal a = new Puppy();
System.out.println(a instanceof Dog d ? "dog" : "other");
}
}
sealed class Animal permits Dog, Cat {
}
sealed class Dog extends Animal permits Puppy {
}
final class Puppy extends Dog {
}
final class Cat extends Animal {
}
- A
dog - B
other - C コンパイルエラーになる
- D 実行時に例外が発生する
正解と解説を見る
正解: A
- A: Puppy は Dog の子クラスなので、a instanceof Dog d は true で dog です。
- B: a の実体 Puppy は Dog を継承しているので、instanceof Dog は true です。
- C: Dog は sealed で Puppy を許可し、Puppy は final なので、すべての子クラスに必要な修飾子が付いていてコンパイルできます。
- D: 例外になる処理はありません。
ポイント
- サブクラスにも sealed を付けて、さらに継承先を制限できます。そのときも permits と修飾子のルールは同じです。