我正在写一个名为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.
}
我认为问题可能来自我的布尔等于方法,但我已经尝试了很多我仍然无法通过测试。这里有一个非常平等的问题吗?有人能帮助我吗?
答案 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;
}