Java Override equals方法给出了一个错误

Java Override equals方法给出了一个错误,java,overriding,equals,Java,Overriding,Equals,我是一名计算机工程专业的学生,一周前开始学习Java。这些天我一直在研究泛型类型,我想把它与equals和Overriding结合起来,所以我写了一个程序,创建一个名为“Punto”的对象,它有两个属性(pointX,pointY),所以它模拟坐标。我在主类之外编写了一个静态方法,该方法使用两个“punto”作为参数并将它们相等。下面是该方法的代码: public static boolean iguales(PuntoImpl<Double> p1, PuntoImpl<Do

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

public static boolean iguales(PuntoImpl<Double> p1, PuntoImpl<Double> p2){
    return p1.equals(p2);
}
publicstaticbooleanigales(puntompl p1,puntompl p2){
返回p1等于(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;
}
@覆盖
公共布尔等于(最终对象obj)
{
if(obj==null | |!(PuntoImpl的obj实例))
返回false;
Puntompl其他=(Puntompl)对象;
如果(other.puntoX!=this.puntoX)返回false;
如果(other.puntoY!=this.puntoY)返回false;
返回true;
}

我试图在坐标X和坐标Y中等于两个参数相同的点,但它返回false。您能帮我找到错误吗?

您正在通过引用等式比较
值。我怀疑您想要
如果(!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);
}
@覆盖
公共布尔等于(最终对象obj)
{
如果(obj==null | | obj.getClass()!=getClass()){
返回false;
}
如果(obj==此){
返回true;
}
Puntompl其他=(Puntompl)对象;
返回other.puntoX.equals(this.puntoX)&&
other.puntoY.equals(this.puntoY);
}
也不要忘记覆盖hashCode


还请注意,比较浮点值是否完全相等通常会产生意外的结果。您可能希望提供一种查找点之间距离的方法,而不是覆盖
equals
,这样您就可以使用某个公差对点之间的距离进行比较。

您通过引用相等来比较
值。我怀疑您想要
如果(!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);
}
@覆盖
公共布尔等于(最终对象obj)
{
如果(obj==null | | obj.getClass()!=getClass()){
返回false;
}
如果(obj==此){
返回true;
}
Puntompl其他=(Puntompl)对象;
返回other.puntoX.equals(this.puntoX)&&
other.puntoY.equals(this.puntoY);
}
也不要忘记覆盖hashCode


还请注意,比较浮点值是否完全相等通常会产生意外的结果。您可能希望提供一种查找点之间距离的方法,而不是覆盖
equals
,这样您就可以将它们与特定公差进行比较。

putoX和putoY的类型是什么?instanceof已经执行空检查,如果您这样做,您可以保留空检查,但我建议将instanceof check替换为实际类的相等性检查。它们是T类型(泛型),但我将它们用作Double。我怀疑问题在于您正在比较
Double
引用。我怀疑你想要
如果(!other.puntoX.equals(this.puntoX))
。另外:Java和JavaScript(几乎)不一样,正如你所知。putoX和putoY的类型是什么?instanceof已经做了空检查,如果你这样做,你可以保留空检查,但我建议将instanceof check替换为实际类的相等性检查。它们是T类型(泛型),但我将它们用作Double。我怀疑问题在于您正在比较
Double
引用。我怀疑您想要
如果(!other.puntoX.equals(this.puntoX))
。另外:正如您所知,Java和JavaScript(几乎)不一样。如果(obj==this)返回true,不应该吗?@RaviThapliyal:对不起,是的-C&P失败。@JonSkeet现在终于可以工作了!非常感谢您的回答,这真的很容易理解:)如果(obj==此)返回真值,是否应该返回真值?@RaviThapliyal:对不起,是的-C&P失败。@JonSkeet现在终于开始工作了!非常感谢您的回答,非常容易理解:)