【发布时间】:2021-01-15 03:50:56
【问题描述】:
为什么 ArrayList 的 contains(Object o) 不运行我重写的 equals(Object o) 方法?考虑这段代码:
private class TargetRC {
public RComponent rc;
public TargetRC(RComponent e) {
rc = e;
}
@Override
public boolean equals(Object o) {
if (o instanceof RComponent)
return o == rc;
else
return o == this;
}
}
private ArrayList<TargetRC> list = new ArrayList<TargetRC>();
public void add(RComponent e) {
list.add(new TargetRC(e));
System.out.println(list.contains(e));
}
如你所见:
-
对称,因为 o == rc 当且仅当 rc == o 时
-
自反,因为 rc == rc
用于比较的任何 RComponent。
通过这里的可见add 方法添加任何元素总是打印错误。没有 println 在 equals 方法内工作。将 == 运算符更改为 equals 没有任何区别。这里有什么问题?
【问题讨论】:
-
你的
equals不是对称的,除非你重写RComponent.equals()来匹配它。