9

我有以下密封接口(Java 15):

public sealed interface Animal permits Cat, Duck {

    String makeSound();
}

该接口由 2 个类实现:

public final class Cat implements Animal {

    @Override
    public String makeSound() {
        return "miau";
    }
}

public non-sealed class Duck implements Animal {

    @Override
    public String makeSound() {
        return "quack";
    }
}

谁能告诉我和之间的final区别non-sealedfinal阻止我创建其他子类,但non-sealed适用于什么行为Duck

4

2 回答 2

12
  • 正如您标记Catfinal,没有其他类可以扩展Cat
  • 正如您所标记Duck的那样non-sealed,任何类都可以扩展Duck

将类标记为 时sealed,所有直接扩展类(permits子句之后的类)都必须标记为final或:sealednon-sealed

  • 将扩展类的类标记sealedsealed,对其应用相同的效果:仅permits允许在子句之后指定的类对其进行扩展。

  • non-sealed只是“打破封印”,因此效果不必向下层级进行。扩展类(再次)是开放的,可以被未知的子类本身扩展。

  • final实际上与在子句sealed之后没有指定任何类相同permits。请注意,permits不可能在后面指定任何内容,因此sealed不能替换final.

于 2020-09-19T18:40:37.750 回答
0

final 类有零个子类,这意味着没有其他类可以扩展它。任何类都可以扩展非密封类。

当你将一个类标记为密封时,只有允许的子类可以扩展它,并且只能有这些修饰符 final、sealed 或 non-sealed:

public sealed class NumberSystem
    // The permits clause has been omitted
    // as all the subclasses exists in the same file.
{ }
non-sealed class Decimal extends NumberSystem { .. }
final class NonRecurringDecimal extends Decimal {..}
final class RecurringDecimal extends Decimal {..}

尽管 NumberSystem 根级层次结构对已知类的集合是封闭的,但您可以使用非密封关键字允许打开子层次结构。

密封和非密封组合允许您限制层次结构的一部分,但不是全部。

在下图中,我们将密封类 NumberSystem 的根层次结构限制为一组已知的子类。但是,非密封的Decimal 类允许任何未知的子类(例如 RecurringDecimal)对其进行扩展。

于 2021-10-27T15:49:36.933 回答