Java 15 でプレビュー シール クラスを使用していますが、なぜキーワードsealed
andnon-sealed
がクラスとインターフェイスにのみ適用され、メソッドには適用されないのか疑問に思っていました (他の修飾子のように)。許可されたサブクラスによってどのメソッドをオーバーライドできるかを具体的に決定することが役立つと思います。
例: Unit
2 つのサブクラスMetric
とを持つクラスがありImperial
、どちらも最終的に基本機能 here を実装しますkind()
。
public abstract sealed class Unit permits Imperial, Metric {
public abstract String kind ();
}
public abstract non-sealed class Imperial extends Unit {
@Override
public final String kind() { return "imperial"; }
}
public abstract non-sealed class Metric extends Unit {
@Override
public final String kind() { return "metric"; }
}
これは機能します。ただし、すべてのサブクラスに実装kind()
するのではなく、オーバーライドが許可されているサブクラスを除くすべてのサブクラスに最終的な実装を提供します。私の考えでは、これは次のようになります。
public abstract sealed class Unit permits Imperial, Metric {
// this is not supported
public sealed String kind () permits Imperial {return "easy"; }
}
public abstract non-sealed class Imperial extends Unit {
@Override
public final String kind() { return "oh my god"; }
}
public abstract non-sealed class Metric extends Unit {
// should not be possible to override kind() here or in any subclass
}
新しい機能でこれを達成できる方法はありますか、それとも他に不足している方法はありますか?