【发布时间】:2021-01-06 08:37:51
【问题描述】:
我有以下密封接口(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-sealed 之间的区别? final 阻止我创建其他子类,但 non-sealed 适用于 Duck 的行为是什么?
【问题讨论】:
-
A
final类永远不能被子类化(旧的、旧的功能)。一个non-sealed类是专门开辟一个类子类,当它的基类是sealed时需要。 -
密封是对确定性的概括; final 类可以由任何东西扩展,密封类可以通过允许的子类型的显式列表进行扩展。 (final 类就像一个带有空许可列表的 selaed 类。)其他语言已经走上了可以任意扩展密封类型的许可子类型的路线,但这常常使人们感到惊讶并可能导致错误。因此 Java 要求您明确说明:对于密封类型的子类型,您必须选择一个:final、sealed 或 open for extension。 (记录是隐式最终的,所以你不必明确地说出来。)
标签: java sealed-class java-15 java-sealed-type