所以场景如下:
class Feline
{
String name;
int age;
equals(Object obj) {...}
hashCode(){...}
}
class Cat extends Feline
{
int teeth;
hashCode(){...}
equals(Object obj)
{
if (!super.equals(obj))
{
return false; //If I don't want this should I use
}
...
}
}
问题是这个继承在现实中是正确的,但对程序来说却不一定正确。我对此的想法是 Cat
实际上应该由 Feline
对象组成。问题是,我应该采用哪种方法?
编辑
这是 Eclipse 的实现,默认 equals/hashcode。执行 equals 可能不是执行此操作的最准确方法。
Oohoh 面对继承的平等检查。这很难正确描述,而且描述起来也很长。
正确的解决方案并不像人们想象的那么简单,所以请转read this - 这应该可以解决您所有的问题。如果不方便再问 :)
编辑:作为上述链接的简短摘要:相等方法应满足以下属性:
- 它是自反的:对于任何非空值 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) 应该一致地返回 true 或一致地返回 false,前提是在对象的 equals 比较中使用的信息没有被修改。
- 对于任何非空值 x,x.equals(null) 应该返回 false。
为了保证这有效,我们需要指定另一个方法:public boolean canEqual(Object other)
。如果另一个对象是(重新)定义了 canEqual 的类的实例,则此方法应返回 true,否则返回 false。
换句话说,如果我们覆盖 equal()
本身,则必须始终覆盖该方法。实现本身很简单,一个简短的例子:
class Foo {
public boolean canEqual(Object other) {
return other instanceof Foo;
}
// equals implementation, etc.
}
equals 方法本身必须始终首先检查给定对象是否可以等于自身,例如类似于 other.canEqual(this) && restOfComparison
的内容。
扩展上述 Foo 的类的简短示例:
class Bar extends Foo {
public boolean equals(Object other) {
if (other instanceof Bar) {
Bar that = (Bar)other;
return that.canEqual(this) && otherStuff;
}
return false;
}
public boolean canEqual(Object other) {
return other instanceof Bar;
}
}