模式匹配穷尽性证明与密封类类型格
深入Java 21模式匹配的编译器穷尽性检查,利用密封类构建类型格(Type Lattice),并通过自定义switch表达式处理嵌套模式。 · 难度:入门 · +10XP
模式匹配穷尽性证明与密封类类型格
当使用密封类时,编译器要求switch覆盖所有子类型。本教程解析穷尽性检查的内部机制,包括未知类型通配符、泛型擦除对模式匹配的影响。实战中讲解如何通过记录模式(Record Pattern)解构嵌套密封类,并利用覆盖保护(Guarded Pattern)实现复杂条件分支。
// 密封类层次
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double a, double b, double c) implements Shape {}
// 穷尽性模式匹配
double area(Shape s) {
return switch (s) {
case Circle(var r) -> Math.PI * r * r;
case Rectangle(var w, var h) -> w * h;
case Triangle(var a, var b, var c) -> {
double p = (a + b + c) / 2;
yield Math.sqrt(p * (p-a) * (p-b) * (p-c));
}
// 编译器确保没有遗漏
};
}