知道对象是否是Java中其他对象的子类

时间:2012-10-16 10:31:16

标签: java

我正在覆盖由字符串标识的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();
}
}

但我还想检查othis的子类,反之亦然,然后在方法equals()中返回true

对于第一种情况,我可以使用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的这个实现的问题是,如果使用id = 1的电影和id = 1的用户调用equals(),它将返回true。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

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

Class.isAssignableFrom

来自javadoc:

  

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true。否则返回false。

因此,上面检查this返回的类是返回的类的超类o

答案 1 :(得分:0)

首先:您的代码在大多数情况下都有效,但最好是根据相等性计算equals(),以避免误报。

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

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

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

虽然

,但我认为不需要这样做

您可以确保“this”是User的子类,如果您可以确保其他类型相同,则它应该是开箱即用的。

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

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();
}
}