Я пишу класс под названием "Координатор". Я создал конструктор:
public final int r,c;
public Coord (int r, int c){
this.r = r;
this.c = c;
}
Я также сделал еще два метода
//Creates and returns a new Coord value with the same row/column
public Coord copy(){
Coord copy = new Coord (r,c);
return copy;
}
//Given another object, is it also a Coord with the same row and column values?
public boolean equals(Object o){
return this==o; //this may be incorrect.
}
Теперь я не могу передать некоторые тестовые примеры следующим образом:
Coord c = new Coord (5,10);
@Test (timeout=2000) public void coord() {
assertEquals(c, c.copy());
assertEquals(c, c);
assertFalse(c.equals(new Coord (2,3))); // @(5,10) != @(2,3).
assertFalse(c.equals("hello")); // must work for non-Coords.
}
Я думаю, проблема может возникнуть из моего метода логических равных, но я много пробовал, я все еще не могу пройти тест. Здесь есть глубокая равная проблема? Кто-нибудь может мне помочь?
Здесь есть глубокая равная проблема?
Ну да, ваш метод equals
просто проверяет, является ли переданное ему значение той же ссылкой. В вашем комментарии говорится, что вы хотите сделать:
//Given another object, is it also a Coord with the same row and column values?
Итак, что вам нужно реализовать:
@Override public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
Coord other = (Coord) o;
return other.r == r && other.c == c;
}
Я также рекомендую вам сделать final
класс (в этом случае вы можете использовать instanceof
вместо вызова getClass()
), и вам нужно реализовать hashCode()
чтобы он соответствовал equals
. Например:
@Override public int hashCode() {
int hash = 23;
hash = hash * 31 + r;
hash = hash * 31 + c;
return hash;
}
equals
определенно неверна. См. Javapractices.com/topic/TopicAction.do?Id=17, чтобы узнать, как переопределитьequal