Java默认模式匹配会匹配所有吗

wen java案例 2

本文目录导读:

Java默认模式匹配会匹配所有吗

  1. instanceof 模式匹配(Java 16+ 正式版)
  2. switch 模式匹配(Java 17+ 预览,Java 21+ 正式版)
  3. 使用 default 或 (通配符模式)
  4. 守卫条件(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 或通配符模式。

抱歉,评论功能暂时关闭!