Java 21记录模式承诺将解构引入 Java 语言。然而,它似乎与模式匹配紧密耦合,只能用作instanceof比较的一部分或在switch语句/表达式中。
考虑以下记录。
public record Point(int x, int y) {}
Run Code Online (Sandbox Code Playgroud)
instanceof有没有一种方法可以在不使用or 的情况下解构该特定类型的对象switch?以下尝试进行解构point。但如果我们假设空安全,该代码就没有什么意义,因为instanceof既没有也没有必要。switch
Point point = new Point(0, 0);
// destructuring with instanceof
if (point instanceof Point(int x, int y)) {
System.out.printf("Point at (%d,%d)", x, y);
}
// destructuring with switch
switch (point) {
case Point(int x, int y) -> System.out.printf("Point at (%d,%d)", x, y);
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用 Java 21 中的记录模式进行模式匹配的示例。官方文档断言空值与任何记录模式都不匹配。但是,我尝试这个例子:
record Point(Integer x, Integer y) {}
public class MainPatternMatchingRecord {
public static void main(String[] args) {
printSum(new Point(null, 2));
}
private static void printSum(Object obj) {
if (obj instanceof Point(var x, var y)) {
System.out.println(x + 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,根据我对 JEP 的理解,new Point(null, 2)不应该匹配 in instanceof Point(var x, var y),但是当运行程序时,会抛出此异常:
线程“main”中的异常 java.lang.NullPointerException:无法调用“java.lang.Integer.intValue()”,因为“x”为 null
为什么会出现这种行为?应该如何正确解释空值与任何记录模式不匹配?