本文目录导读:

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 或通配符模式。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播