2015-10-05 5 views
0

Я студент-программист, и я начал Java неделю назад. Я изучал эти общие типы, и я хотел смешивать их с равными и 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 уже выполняет null-check, вы можете оставить nullcheck, если вы сделаете это так, но я бы рекомендовал заменить проверку instanceof проверкой на равенство фактических классов. – Stultuske

+0

Они типа T (generic), но я использую их как Double – 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