本文目录导读:

instanceof模式匹配(Java 16+ 正式版)switch模式匹配(Java 17+ 预览,Java 21+ 正式版)- 使用
default或 (通配符模式) - 守卫条件(Guarded Patterns)
不会。
Java 的模式匹配(Pattern Matching)并非默认匹配所有,它是有条件的、智能的类型检查和提取机制。
根据你使用的 Java 版本和具体特性(instanceof 模式匹配或 switch 模式匹配),行为有所不同,但共同点是:只有当你显式使用模式匹配语法时才会进行匹配,并且匹配是有条件的(取决于值的类型和额外的守卫条件)。
instanceof 模式匹配(Java 16+ 正式版)
这是最经典的例子,它不会“匹配所有”,而是先检查类型,再自动提取变量。
Object obj = "Hello, World!";
// 传统写法:
if (obj instanceof String) {
String s = (String) obj; // 需要手动强转
System.out.println(s.length());
}
// 模式匹配写法:
if (obj instanceof String s) {
// 只有当 obj 是 String 类型时,s 才会被绑定
System.out.println(s.length());
}
- 默认不匹配所有:只有当
obj确实是String类型时,模式String s才会匹配成功,s才会被赋值。 - obj 是
Integer,则不会进入 if 体,也不会定义s。
switch 模式匹配(Java 17+ 预览,Java 21+ 正式版)
这里需要特别注意:传统 switch 是匹配所有(fall-through),但模式匹配的 switch 默认不会 fall-through。
传统 switch(默认 fall-through,匹配所有 case)
int day = 2;
switch (day) {
case 1:
System.out.println("Monday");
// 没有 break,会继续执行下一个 case
case 2:
System.out.println("Tuesday");
default:
System.out.println("Other");
}
// 输出:Tuesday \n Other
// 因为没有 break,所以匹配了 case 2 后继续执行了 default
模式匹配 switch(默认不 fall-through,只匹配第一个符合条件的)
Object obj = 42;
switch (obj) {
case Integer i -> System.out.println("Integer: " + i);
case String s -> System.out.println("String: " + s);
case Long l -> System.out.println("Long: " + l);
default -> System.out.println("Other");
}
// 输出:Integer: 42
// ⚠️ 不会继续匹配后面的 case(没有 fall-through)
关键点:
- 模式匹配的 switch 使用
->或 但默认不会 fall-through。 - 它只匹配第一个符合条件的模式。
- 如果没有任何模式匹配,才会执行
default。
使用 default 或 (通配符模式)
你可以显式写一个 default 分支来捕获所有未被前面模式匹配的值:
Object obj = 3.14;
switch (obj) {
case Integer i -> System.out.println("Int");
case String s -> System.out.println("String");
default -> System.out.println("Something else"); // 匹配所有剩余情况
}
在 Java 21+ 中,还可以使用 作为通配符模式(类似 default,但更精细):
switch (obj) {
case Integer i -> ...
case null -> ... // 可以单独处理 null
case _ -> ... // 匹配任何其他值(包括以前没有覆盖的类型)
}
守卫条件(Guarded Patterns)
模式匹配还支持添加额外的条件,进一步限制匹配的范围:
Object obj = 100;
switch (obj) {
case Integer i when i > 50 -> System.out.println("大整数");
case Integer i -> System.out.println("小整数");
default -> System.out.println("非整数");
}
// 输出:大整数
这里即使 obj 是 Integer,如果不满足 i > 50 的条件,也不会匹配第一个模式。
| 场景 | 是否匹配所有 | 说明 |
|---|---|---|
instanceof 模式匹配 |
❌ 不匹配 | 只有类型匹配时才匹配 |
switch 模式匹配(->) |
❌ 不匹配 | 只匹配第一个符合条件的case |
switch 传统写法(无break) |
✅ 匹配所有(fall-through) | 会继续执行后续case |
显式写 default 或 |
✅ 匹配剩余所有 | 作为兜底分支 |
所以结论很明确:Java 的默认模式匹配不会匹配所有,它是有条件的、智能的类型检查机制,如果你想匹配所有情况,需要显式写 default 或通配符模式。