覆盖equals方法会出错

时间:2015-10-05 08:40:18

标签: java override equals

我是一名计算机工程专业的学生,​​我在一周前开始Java。我现在一直在研究泛型类型,我想把它与equals和Overriding混合在一起,所以我编写了一个程序来创建一个名为" Punto"有两个属性(pointX,pointY)所以它模拟坐标。我在主类之外写了一个静态方法,它使用了两个" Puntos"作为参数并等于它们。这是该方法的代码:

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

我试图压倒平等:

@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中使用相同参数等于两个点,但它返回false。你能帮我找到错误吗?

1 个答案:

答案 0 :(得分:4)

您通过引用相等性比较Double值。我怀疑你想要if (!other.puntoX.equals(this.puntoX))等我真的把这段代码写成:

@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,这样您就可以将它们与某个公差进行比较。