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();
}
<h3>用 switch 表达式统一处理多类型分支</h3>
<p>当判断对象属于多种可能类型时,switch 表达式比 if-else 链更清晰,且天然支持模式匹配:</p>
<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
}
</string>
或者在 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 外访问
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











