Java 14起逐步引入并完善模式匹配:14预览instanceof模式匹配,17正式支持,21全面支持switch模式匹配与开关表达式,提升类型判断的简洁性、安全性与可读性。

Java 14 引入模式匹配(预览),17 正式支持 instanceof 模式匹配,21 起全面支持 switch 模式匹配与开关表达式——它们共同让类型判断更简洁、安全、可读。
用 instanceof 模式匹配替代冗长的类型检查+强转
传统写法需要先用 instanceof 判断,再显式强转,容易出错且重复:
if (obj instanceof String) {
String s = (String) obj; // 手动强转,易漏或写错
return s.length();
} else if (obj instanceof List) {
List<?> list = (List<?>) obj;
return list.size();
}
模式匹配直接绑定变量,类型安全且一步到位:
if (obj instanceof String s) { // 自动绑定为 s,类型已确认
return s.length();
} else if (obj instanceof List<?> list) {
return list.size();
}
</p>
<H3>用 switch 表达式统一处理多类型分支</H3>
<p>当判断对象属于多种可能类型时,switch 表达式比 if-else 链更清晰,且天然支持模式匹配:</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a></a>”;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill5703" title="deep-java-review"><img
src="https://img.php.cn/upload/skill/000/000/081/179060057413304.jpg" alt="deep-java-review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill5703" title="deep-java-review">deep-java-review</a>
<p>Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...</p>
</div>
<a href="/xiazai/skill5703" title="deep-java-review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
<font color="gray">
<pre class="brush:php;toolbar:false;">
return switch (obj) {
case String s -> s.length();
case Integer i -> i.toString().length();
case List<?> list -> list.size();
case null -> 0;
default -> -1;
};
注意几点:
- 每个 case 必须有返回值(或 throw),整个 switch 是一个表达式,可直接赋值或 return
- case 后直接写类型模式,变量名自动声明并绑定,作用域限于该分支
- null 和 default 必须显式处理,避免遗漏空值或未知类型
嵌套模式匹配处理复杂结构
模式匹配支持组合,比如判断一个 List 是否包含特定类型的元素:
if (obj instanceof List<String> stringList && !stringList.isEmpty()) {
String first = stringList.get(0);
// 安全使用 first
}
或者在 switch 中嵌套:
return switch (obj) {
case List<?> list when list.size() == 1 ->
switch (list.get(0)) {
case String s -> "single-string: " + s;
case Integer i -> "single-int: " + i;
default -> "single-other";
}
case String s -> "plain-string: " + s;
default -> "unknown";
};
guard clause(when 子句)可用于添加额外条件,增强判断精度。
注意事项与兼容性提醒
模式匹配不是语法糖,它依赖 JVM 层面的支持,需注意:
- instanceof 模式匹配从 Java 14(预览)→ 16(正式)→ 17(稳定)
- switch 模式匹配和开关表达式从 Java 17(预览)→ 21(正式稳定)
- 确保编译和运行环境 ≥ 对应版本,IDE 需启用对应语言级别(如 Java 21)
- 模式变量不可重复声明,且不能在 case 外访问

















