2014-09-19 5 views
0

У меня возникла проблема с переопределением метода equals в одном классе, этот класс имеет только один атрибут, который представляет собой двумерный массив, называемый сеткой. Это конструктор:Метод Equals всегда возвращает true JAVA

public World(int n, int m){ 
    this.grid = new Object[n][m]; 
} 

Равных метод:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (null == obj) 
     return false; 
    if (!obj instanceof World) 
     return false; 
    World other = (World) obj; 
    if (!Arrays.deepEquals(grid, other.grid)) 
     return false; 
    return true; 
} 

Я уже переопределен метод hashCode() как хорошо, но проблема в том, что не имеет значения, в случае, равно всегда возвращается правда. Кто-нибудь знает, что не так?

+0

на самом деле он всегда возвращается ложный –

+0

http://sscce.org/ –

+0

Вы уверены, что объекты в сетке равны? –

ответ

4

Будьте осторожны - вы здесь возились с Object.

Независимо от фактических объектов, которые вы помещаете в этот массив, все они будут использовать для сравнения Object#equals. Причина этого lies in the documentation of Arrays#deepEquals.

Два возможно нулевые элементы e1 и e2 глубоко равны, если какой-либо из следующих условий:

  • e1 и e2 являются массивы объектных ссылок типов, и Arrays.deepEquals (e1, e2) вернет true
  • e1 и e2 - это массивы того же примитивного типа, и соответствующая перегрузка массивов Arrays.equals (e1, e2) вернет true.
  • e1 == e2
  • e1.equals (e2) вернет true.

И ... угадайте, что делает Object#equals:

public boolean equals(Object obj) { 
    return (this == obj); 
} 

Ваши массивы будут только когда-либо быть эквивалентны тогда и только тогда, когда они содержат те же экземпляры материала между их.

Применение более строгих типов вокруг вашего массива, например конкретного класса, может помочь вам решить проблему. Мы не знаем, что вы храните в этом массиве, поэтому я не могу предложить ничего конкретного, но смотрю, чтобы отойти от Object.

+1

Если 'Object # equals' переопределен, вместо этого будет использоваться метод overriding. –

0

Попробуйте this-

public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (!(obj instanceof World)) { 
     return false; 
    } 
    World other = (World) obj; 
    if (!Arrays.deepEquals(this.grid, other.grid)) 
     return false;  
    return true; 
} 
Смежные вопросы