2015-10-05 59 views
0

我是计算机工程专业的学生,​​我已经在一周前开始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相同的参数等于两分,但它返回我是假的。你能帮我找到错误吗?

+0

putoX和putoY有哪些类型? – Stultuske

+0

instanceof已经做了一个空检查,如果你这样做,你可以保留nullcheck,但是我会建议通过检查实际类的相等性来替换instanceof检查。 – Stultuske

+0

他们是T类型(通用),但我使用他们作为双 – xFunkyTImes

回答

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,因此您可以将它们与某个容差进行比较。

+0

不应该如果(obj == this)返回true? –

+0

@RaviThapliyal:对不起,是的 - C&P失败。 –

+0

@JonSkeet现在终于开始了!非常感谢你的回答,这很容易理解:) – xFunkyTImes