Java 16起instanceof模式匹配将类型检查、强转和使用压缩为一步,如obj instanceof String s,s在if块内自动绑定为非null String类型,仅支持引用类型,不支持基本类型或具体泛型参数。

instanceof 模式匹配:一行搞定类型校验与变量使用
Java 16 起正式支持 instanceof 模式匹配,不再需要先判断再强转:
- 旧写法要写两次
String:先obj instanceof String,再(String) obj,容易写错或漏括号 - 新模式写成
obj instanceof String s,条件为真时,s就是已确认非 null、类型准确的局部变量,作用域只在 if 块内 - 支持所有引用类型(
String、List、Integer等),但不支持基本类型(如int、boolean) - 泛型写法有限制:可用
instanceof List<?> list,不可写instanceof List<String> list(类型擦除导致编译报错)
switch 表达式 + 类型模式:统一处理多种类型
当对象可能是好几种类型时,用 switch 表达式比一长串 if-else 更清晰、更健壮:
- 每个
case Type var都自动完成类型匹配和变量绑定,var在该分支里可直接用 -
case null显式处理空值,避免 NPE;default必须存在,否则编译不通过,强制你考虑兜底逻辑 - 支持守卫条件(
when),比如case Integer i when i > 0,类型匹配后再加业务判断 - 返回值直接由箭头表达式给出,不用 break,也不会掉进下一个 case
record 解构 + 模式匹配:深入数据结构一层取值
如果类型是 record(Java 14 引入),switch 还能直接解构字段,跳过 getter:
- 定义
record User(String name, int age) {},就能写case User(String n, int a) -> "Hi " + n; - 支持嵌套解构,比如
case User(String n, Address(String city, String zip)) - Java 22 开始允许用下划线
_忽略不需要的字段,例如case User(String n, _) -> n; - 配合 sealed class 使用时,编译器能提示你是否遗漏某个子类分支,增强类型完备性
实际用法注意点
模式匹配不是银弹,用对地方才真正提效:
立即学习“Java免费学习笔记(深入)”;
- 变量作用域很严格:只在对应 if 分支或 case 块内有效,出块就不可见
- 不能替代运行时类型分析:比如想判断
List<String>的元素类型,仍需遍历或配合 stream.filter + instanceof - 需要 JDK 16+ 编译,JDK 17+ 才完整支持 switch 模式匹配,开发环境别用太老的版本
- 和传统反射、
isAssignableFrom无关,它是编译期+运行期协同的静态类型机制


















