java 16+ 的 instanceof 支持模式匹配,可一步完成类型检查、变量声明与类型转换;语法为 if (obj instanceof type varname),变量作用域仅限真分支,要求 obj 非 null、type 为 final 类/枚举/record。

Java 16+ 的 instanceof 支持模式匹配,核心是“一步完成类型检查 + 变量声明 + 类型转换”。它消除了传统写法中冗余的强制转换和重复的类型判断,让代码更简洁、安全、可读性更高。
语法结构:instanceof Type varName
基本形式为:if (obj instanceof String s)。其中:
-
obj是待检查的表达式(必须是非 null) -
String是目标类型(必须是 final 类、枚举、或不可变 record;不能是泛型类型变量或数组类型) -
s是新声明的局部变量名,作用域仅限于该if语句的真分支(包括其嵌套块)
典型用法示例
对比传统写法与模式匹配写法:
// ✅ Java 14+(预览)、Java 16+(正式支持)模式匹配写法
if (obj instanceof String s) {
System.out.println("长度:" + s.length()); // s 已自动转换为 String,可直接使用
} else if (obj instanceof Integer i) {
System.out.println("数值:" + i.intValue());
}
// ❌ 传统写法(冗余且易错)
if (obj instanceof String) {
String s = (String) obj; // 手动转换,可能因类型不一致导致 ClassCastException(虽此处不会,但逻辑上不严谨)
System.out.println("长度:" + s.length());
}
作用域与生命周期限制
模式变量(如 s)只在 instanceof 表达式为 true 的作用域内有效:
- if 块内、
else if块内、三元运算符的真分支中可用 - else 块、
if外部、或后续同级语句中不可访问(编译报错)
注意事项与限制
- 不支持
null:若obj == null,instanceof结果为false,模式变量不被初始化,也不会抛异常 - 不支持泛型类型参数:如
obj instanceof List<string> list</string>是非法的(类型擦除导致无法在运行时确认泛型信息) - 不支持数组类型:如
obj instanceof int[] arr编译失败(Java 当前版本仍不支持) - 变量名不能与已有局部变量冲突,且必须是合法标识符(不能是关键字)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











