我有一个坐标类和一个坐标列表。我已经覆盖了坐标类的equals方法,但是当我在坐标列表中使用contains时,对于列表中的坐标我得到false。 有谁知道我哪里出错了? x和y值是整数。
public boolean equals(Coordinate c){
return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
}
列表如下:
List safe_locs = new ArrayList<Coordinate>();
测试如下:
System.out.println(c);
System.out.println(safe_locs.contains(c));
System.out.println(safe_locs);
输出是:
Coordinate[x: 0, y: 0]
false
[Coordinate[x: 0, y: 0], Coordinate[x: 1, y: 0], Coordinate[x: 0, y: 1], Coordinate[x: 3, y: 0], Coordinate[x: 0, y: 3]]
答案 0 :(得分:10)
您的equals()
方法重载 equals(Object)
,而它覆盖:
@Override
public boolean equals(Object o){
if(!(o instanceof Coordinate)) {
return false;
}
Coordinate c = (Coordinate)o;
return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
}
不幸的是你必须使用向下转发。请注意@Override
注释 - 将来使用它来避免此类问题。
答案 1 :(得分:2)
我知道很多读者会发现这种equals
实现风格无法接受,但是equals
是一种非常标准的,全面的样板方法,一旦你实现了几百个,你倾向于越来越多地欣赏这种风格:
@Override
public boolean equals(Object o) {
Coordinate that;
return this == o || o instanceof Coordinate
&& this.x == (that = (Coordinate)o).getxCoordinate()
&& this.y == that.getyCoordinate();
}
关键是,无论你一直使用什么样的实现方式,你很快就会停止查看详细的程序逻辑,只注意到显着的特征:参与哪些字段以及比较它们的方式。一旦达到这一点,这种实现的简洁性就会闪耀。如果您怀疑是一个错误,那么再次减少代码,减少检查它的工作量。
答案 2 :(得分:0)
我认为您重载 equals()
方法而非覆盖 ..
public boolean equals(Object o){
if(!(o instanceof Coordinate)) {
return false;
}
else{
Coordinate c = (Coordinate)o;
return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
}
}