Deep equal issue about boolean method with a Object argument

I am writing a class called Coord. I have created a constructor:

public final int r,c;  
public Coord (int r, int c){
this.r = r;
this.c = c;
}

I also did another two methods

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

Now I can not pass some test cases as following:

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

I think the problem may arise from my boolean equals method, but I have tried a lot I still cannot pass the test. Is there a deep equal issue here? Can someone help me?

Jon Skeet
people
quotationmark

Is there a deep equal issue here?

Well yes, your equals method just checks whether the value passed to it is the same reference. Your comment says what you want to do:

//Given another object, is it also a Coord with the same row and column values?

So that's what you need to implement:

@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;
}

I'd also encourage you to make the class final (in which case you can use instanceof instead of calling getClass()) and you need to implement hashCode() to be consistent with equals too. For example:

@Override public int hashCode() {
    int hash = 23;
    hash = hash * 31 + r;
    hash = hash * 31 + c;
    return hash;
}

people

See more on this question at Stackoverflow