Глубокая проблема с булевым методом с аргументом Object

1

Я пишу класс под названием "Координатор". Я создал конструктор:

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.
}

Я думаю, проблема может возникнуть из моего метода логических равных, но я много пробовал, я все еще не могу пройти тест. Здесь есть глубокая равная проблема? Кто-нибудь может мне помочь?

  • 0
    Какие тестовые случаи не проходят? Ваша реализация equals определенно неверна. См. Javapractices.com/topic/TopicAction.do?Id=17, чтобы узнать, как переопределить equal
Теги:

1 ответ

3
Лучший ответ

Здесь есть глубокая равная проблема?

Ну да, ваш метод 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;
}
  • 1
    В дополнение к этому ответу я бы также добавил, что в методе копирования нет особого смысла, так как ваш класс неизменен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню