如何覆盖对象类中的equals方法?
即我有
class Person{
//need to override here
public boolean equals (Object obj){
}
我想将参数obj转换为Person类型,但是如果我(Person)obj它将无法工作。
答案 0 :(得分:10)
它实际上比你想象的要复杂得多。让Eclipse(或你正在使用的任何IDE)自动生成equals
方法;在进行比较之前,你会看到它包含一些检查和强制转换。
答案 1 :(得分:8)
您可以将其强制转换为方法,只需使用
实例确保其类型正确if(obj instanceof Person)
{
Person otherPerson = (Person) obj;
//Rest of the code to check equality
}
else
{
//return false maybe
}
答案 2 :(得分:8)
@Override
public boolean equals(Object o)
{
if (o instanceof Person)
{
Person c = (Person) o;
if ( this.FIELD.equals(c.FIELD) ) //whatever here
return true;
}
return false;
}
答案 3 :(得分:5)
看看Regarding Object Comparison。
请注意,如果您覆盖equals()
,必须也会覆盖hashCode()
。 equals / hashCode契约是如果两个对象相等,则它们必须具有相同的哈希码。
答案 4 :(得分:3)
如果您打算创建Person的子类,请使用类似
的内容if(obj!= null&& obj.getClass()== Person.class)
而不是instanceof
答案 5 :(得分:2)
使用getClass()
而不是instanceof
的唯一原因是,如果想要断言所比较的两个引用都指向完全相同类的对象而不是实现相同基类的对象。
假设我们有Employee
e 和Manager
m (扩展Employee
)。
m instanceof Employee
会产生真,m.getClass() == Employee.class
会返回false。
在某些情况下,后者可能是首选,但在equals()
或hashCode()
方法中比较实例时很少。
答案 6 :(得分:1)
对于任何字段类型,我更喜欢更简单的,null-safe(r)Objects.equals
:
@Override
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return Objects.equals(p.FIELD, this.FIELD);
}
return false;
}
答案 7 :(得分:0)
在覆盖equals()
方法(以及hashcode()
)方法之后,还可以了解另外一点,您可以比较同一类的两个对象,如下所示:
Person p1 = new Person();
Person p2 = new Person();
....
if ( p1.equals( p2 ) )
{
// --- Two Persons are equal, w.r.t the fields you specified in equals method ---
}
答案 8 :(得分:0)
我知道这已经得到了解答,但在我的旅行中,我发现这是覆盖对象比较的最有效方法,以确保它在全局范围内发生相同:
@Override
public boolean equals(Object o) {
return o instanceof Person && this.getSomeMagicalField().equals(((Person) o).getSomeMagicalField());
}
或如果您不比较字符串:
@Override
public boolean equals(Object o) {
return o instanceof Person && this.getSomeMagicalField() == (Person) o).getSomeMagicalField();
}