0

我正在覆盖由字符串标识的 Object 的 equals(Object o) 方法:

class User {
@Override
public boolean equals(Object o) {       
    return o != null && o.hashCode() == this.hashCode();
}

@Override
public int hashCode() {
    return id.hashCode();
}
}

但我还想在方法中返回 true 之前检查是否o是的子类this或反之亦然equals()

对于我可以使用的第一种情况,if (o instance of User)但如何以另一种方式进行检查?

谢谢

编辑:由于我没有正确解释它,我将解释完整的问题:

我有课

public abstract class UniqueIdentifiedObject<E> {
    private E id;

    protected UniqueIdentifiedObject(E id) {
        super();
        this.id = id;
    }

    public E getId() {
        return id;
    }

    @Override
    public boolean equals(Object o) {
        return o != null && o.hashCode() == this.hashCode();
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }

}

并且想法是当它由一个元素唯一标识时用一个对象继承这个类:例如,如果我的应用程序的用户由一个整数标识,我将使用:

class User extends UniqueIdentifiedObject<Integer>

和电影

class Movie extends UniqueIdentifiedObject<Integer>

UniqueIdentifiedObject 实现的问题在于,如果调用equals()id = 1 的电影和 id = 1 的用户,它将返回 true。

我该如何解决这个问题?

4

2 回答 2

4
this.getClass().isAssignableFrom(o.getClass());

Class.isAssignableFrom

从javadoc:

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。

所以上面检查返回的this类是返回的类的超类 be o

于 2012-10-16T10:36:28.997 回答
0

首先:您的代码在大多数情况下都可以工作,但是根据相等性计算 equals() 是一种很好的做法,以避免误报。

您可以使用“Class.isAssignableFrom”检查动态类型,例如

   this.getClass().isAssignableFrom(other.getClass())

会告诉你, other 是同一个类还是“this”的任何子类。(因为这必须是其他的超类)

不过,我认为这里没有必要这样做

您可以确保“this”是 User 的子类,并且如果您可以确保 other 属于同一类型,那么它应该可以开箱即用。

所以在你的情况下,该方法可能看起来像

class User {
@Override
public boolean equals(Object o) {
   if (o==null) {
      return false;
   }
   if (o instanceof User) {
     return (o.id==null && id==null ) || (o.id.equals(id));
   }
}
@Override
public int hashCode() {
    return id.hashCode();
}
}
于 2012-10-16T10:42:36.530 回答