java通过equals和hashcode区分子类
我正在寻找关于在子类中重写hashcode和equals的指导
我在这里发现了一个类似的问题:Overriding equals() & hashCode() in sub classes ... considering super fields
但我想要的是稍微不同的东西
想象一下这个(有点愚蠢的)例子:
class Food {
String name;
@Override
public boolean equals(Object obj) {
if (obj instanceof Food) {
Food other = (Food)obj;
return name.equals(other.name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode();
}
}
class Vegetable extends Food {
// No additional fields here
// Some methods here
}
class Fruit extends Food {
// No additional fields here
// Some methods here
}
鉴于:
- 子类不添加任何额外字段
- 至少在这个例子中,它们基本上只是标记类
- 同名的
Fruit
和Vegetable
不应该相等
问题:
- 您希望子类equals只包含子类的
instanceof
检查和对super.equals
的调用吗李> - 为了让同名的
Fruit
和Vegetable
实例具有不同的哈希代码,应该如何构造哈希代码李>
# 1 楼答案
<>这可能不是一个EME>问题,但这是一件你应该考虑的事情。p>instanceof
在这里是危险的,因为Food
不是抽象的。这意味着equals
是不对称的如果你不想破坏合同,在这种情况下
Food
应该检查this.getClass() == obj.getClass()
。如果你这样做了,那么你也不一定需要在子类中重写它否则就无关紧要了。该方法是按合同定义的,您可以按照自己的意愿实现它
他们不需要与众不同