在重写的equals函数中,"o instanceof Point point"的含义是什么?

3
我有一个名为Point的类,代码如下:
public class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Point point)) return false;
        return x == point.x && y == point.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
}

equals函数是由IntelliJ生成的,它也可以接受Point的子类作为参数。但我不理解if (!(o instanceof Point point))的含义。为什么在Point后面还有point,而且在equals函数中如何定义point


11
instanceof的模式匹配 - QBrute
这个代码段:“if (!(o instanceof Point point))” 是否能编译通过?我猜你的意思是:if (!(o instanceof Point))。 - Stultuske
3
@Stultuske,他们没有“打错”任何东西,因为这是由IntelliJ生成的。point变量的声明对于下面的代码行是必要的。请参阅JEP开始的部分“The flow scoping analysis...” - Michael
4
我仍在逐渐习惯于模式变量的作用域可以超出其声明的语句范围。 - tgdavies
@Michael 这是在哪个版本中添加的? - Stultuske
1
@Stultuske 它在14版本中作为预览功能被引入:https://openjdk.org/jeps/305 - QBrute
1个回答

4
这被称为“instanceof的模式匹配”。
我假设你知道之前的语法,它应该是。
if( !(o instanceof Point) ) return;

Point point = (Point)o;

return x == point.x && y == point.y;

从Java 16开始,有一种新的语法,其目的是更加简洁。

if( !(o instanceof Point point) ) return;

return x == point.x && y == point.y;

不必进行强制类型转换和创建本地变量,您可以在 instanceof 语句中声明变量。

模式变量的作用域被描述为“流程作用域”,详见 JEP 394,这可能有点不直观。instanceof 的模式匹配 中有更多示例。


1
我知道这个功能,但没有意识到它的作用域规则是不同的,今天我学到了!但是你提供的链接没有提到“流程作用域”的名称。你有这个名称的来源吗?特别是对于新功能,当我谈论它们时,我想非常具体和“正确”。 - Joachim Sauer
4
@JoachimSauer JEP 394 在几个地方提到了这个术语。 - QBrute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接