给出如下
sealed
层次结构
sealed interface Shape permits Rectangle, Square
record Rectangle() implements Shape
record Square() implements Shape
由于
Rectangle
和 Square
是记录,它本质上使整个层次结构不可扩展,即不再允许有更多的子类。
从 JDK 21 开始,
switch
的模式匹配通过覆盖所有可能的 case
或提供 default
案例来覆盖其余部分来强制切换为详尽无遗。
因此,对于以下
switch
,在什么情况下会执行default
案例,因为涵盖了所有可能的组合,为什么甚至允许这样做?
switch (shape) {
case Rectangle r -> // do something with r;
case Square sq -> // do something with sq;
case null -> // shape could be null
default -> // WHY is this permitted when all possible cases are covered already??
}
P.S.:密封的层次结构肯定可以进化,但是当这种情况发生时,编译器会自动标记
switch
来升级自身。
基本上它就在那里,因为 Java 不能相信你不会在不更新开关的情况下添加另一个 Shape 记录,而且它并没有真正伤害任何东西,所以没有理由禁止它