问题
在父类中重写了equals方法,将父类对象添加进list中并且不存在子类对象时,调用list.contains(子类)返回true,反之亦然。
结论
重写equals时要考虑以下原则:
- 自反性:非空引用x,x.equals(x)应返回true
- 对称性:非空引用x,y,当且仅当x.equals(y)==true时,y.equals(x)==true
- 传递性:非空引用x,y,z,若x.equals(y)==true,y.equals(z)==true,则x.equals(z)==true。
- 一致性:若x,y引用对象没有改变,则反复调用x.equals(y)应返回相同值。
- 空引用:x.equals(null) 应返回false
上述问题是因为没考虑“对称性”原则,子类会继承父类equals方法,因此无论父类.equals(子类)
还是子类.equals(父类)
都是true。
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class A {
public String obj;