我正在覆盖由字符串标识的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();
}
}
但我还想检查o
是this
的子类,反之亦然,然后在方法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。
我该如何解决这个问题?
答案 0 :(得分:4)
this.getClass().isAssignableFrom(o.getClass());
来自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();
}
}