问题描述
我具有以下密封接口(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
的行为是什么?
解决方法
- 将
Cat
标记为final
后,其他任何类都不能扩展Cat
。 - 将
Duck
标记为non-sealed
后,任何类都可以扩展Duck
。
在将类标记为sealed
时,所有直接扩展的类(在permits
子句之后的类)都必须标记为final
,sealed
或{{ 1}}:
-
将扩展
non-sealed
类的类标记为sealed
,对其具有相同的效果:仅允许在sealed
子句之后指定的类对其进行扩展。 / p> -
permits
只是“打破了封印”,因此效果不必在层次结构中进行。扩展类是开放的(再次),可以由未知子类本身扩展。 -
non-sealed
与final
有效,与sealed
相同,但没有在permits
子句之后指定任何类。请注意,在permits
之后不能指定任何内容,因此sealed
无法替换final
。