关于java:覆盖equals方法会出错

Override equals method gives an error

我是一名计算机工程专业的学生,一周前开始学习Java。我最近一直在研究通用类型,我想把它与equals和overriding混合,所以我编写了一个程序,创建了一个名为"punto"的对象,有两个属性(pointx,pointy),这样它就可以模拟坐标。我在主类之外编写了一个静态方法,它使用两个"puntos"作为参数并等于它们。下面是该方法的代码:

1
2
3
public static boolean iguales(PuntoImpl<Double> p1, PuntoImpl<Double> p2){
    return p1.equals(p2);
}

这是我试图超越平等:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public boolean equals(final Object obj)
{
    if (obj == null || !(obj instanceof PuntoImpl))
        return false;

    PuntoImpl<T> other = (PuntoImpl<T>) obj;

    if (other.puntoX != this.puntoX)     return false;
    if (other.puntoY != this.puntoY)     return false;

    return true;
}

我试图在坐标x和坐标y中等于两个参数相同的点,但它返回错误。你能帮我找出错误吗?


你在通过引用相等来比较Double的值。我怀疑你想要if (!other.puntoX.equals(this.puntoX))等。我实际上写的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public boolean equals(final Object obj)
{
    if (obj == null || obj.getClass() != getClass()) {
        return false;
    }
    if (obj == this) {
        return true;
    }

    PuntoImpl<T> other = (PuntoImpl<T>) obj;

    return other.puntoX.equals(this.puntoX) &&
           other.puntoY.equals(this.puntoY);
}

别忘了重写hashCode

还要注意,比较浮点值以获得精确的相等性通常会得到意想不到的结果。您可能希望提供一种方法来查找点之间的距离,而不是覆盖equals,这样您就可以将它们与某个公差进行比较。