关于带有Object参数的boolean方法的深层同等问题

时间:2015-03-24 18:33:03

标签: java

我正在写一个名为Coord的课程。我创建了一个构造函数:

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

我认为问题可能来自我的布尔等于方法,但我已经尝试了很多我仍然无法通过测试。这里有一个非常平等的问题吗?有人能帮助我吗?

1 个答案:

答案 0 :(得分: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;
}