You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

密封层级结构下已穷尽case的switch语句default分支何时执行?

密封类与Switch模式匹配中Default分支的疑问

背景代码

sealed interface Shape permits Rectangle, Square

record Rectangle() implements Shape

record Square() implements Shape

问题说明

由于Rectangle和Square是record,这个类型层级本质上无法扩展,不能添加更多子类。从JDK 21开始,带模式匹配的switch语句要求必须穷尽所有可能——要么覆盖所有case,要么提供default分支兜底。

但下面的switch语句已经覆盖了所有可能的情况(包括null),那default分支何时会被执行?编译器为何允许它存在?

switch (shape) {
    case Rectangle r -> // 处理r;
    case Square sq -> // 处理sq; 
    case null -> // 处理null情况
    default -> // 明明覆盖了所有情况,为啥这个分支被允许?
}

补充:密封层级确实可以演进(比如后续修改permits列表添加新子类),但此时编译器会自动标记switch语句,要求同步更新。

解答

1. Default分支的执行时机

永远不会执行。当前的case已经覆盖了Shape的所有许可子类,加上null分支,所有可能的输入情况都被完全覆盖,程序运行时根本不会走到default分支。

2. 允许存在的原因

这是Java语言在兼容性与灵活性上的设计考量:

  • 兼容开发习惯:部分开发者习惯保留default分支,即使逻辑上不需要,语言允许这种写法,避免强制修改既有代码。
  • 应对密封类的演进:虽然当前密封层级没有其他子类,但如果后续修改Shape的permits列表添加新实现类,没有default分支的话编译器会直接报错要求更新switch;而保留default分支的话,它会自动兜底新添加的类型,避免代码立即失效(当然这只是临时方案,长期建议显式处理新类型)。
  • 语法宽容性:Java并没有强制要求“穷尽所有case后必须删除default”,只要switch满足穷尽性要求(要么覆盖所有case,要么有default),两种写法都被允许。

内容的提问来源于stack exchange,提问作者Ammar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:24:53