我在Java中有多个数据对象类型的基类。我想在基类中创建一个equals
方法,它在继承时直接工作。
平等由两个对象决定
属于基类的子类。使用
可以轻松实现if (!(anObject instanceof BaseClass))
return false;
具有相同的ID。 ID字段由基类定义,因此我们可以在此测试。
if (this.id != ((BaseClass) anObject).id)
return false;
属于同一个班级。这就是我遇到问题的地方。两个对象可以是不同类型的(因此可以在不同的列表中),但具有相同的ID。我必须能够区分它们。我怎么能这样做?
答案 0 :(得分:6)
使用
this.getClass() == anotherObject.getClass()
而不是instanceof。仅当两个对象属于同一个类时才会返回true(通过引用检查类对象是否相等是安全的)。之后你可以比较一下。
答案 1 :(得分:1)
在实施equals时,您应该阅读this article的问题。
缩短:使用this.getClass()==other.getClass()
代替instanceof
,否则equals()
关系将不会传递(superInstance.equals(subInstance)
将是是的,但subInstance.equals(superInstance)
将为假。)
答案 2 :(得分:0)
如果我理解你的问题是正确的,你需要一种方法来区分具有相同id的同一个Class的两个对象。如果是这样,为此你可以使用toString(),它给出了对象的唯一表示,除非它们是字符串对象。当然,您不能在基类中覆盖toString()。 示例:您可以使用此功能,仅用于您提到的第三种情况。
if (this.toString()!= anObject.toString())
return false;
答案 3 :(得分:-1)
您可以使用Class.isInstance()
方法执行此操作。在您的基类中,执行此操作。
public static boolean isAnInstance(Object obj)
{
return BaseClass.class.isInstance(obj);
}
然后你可以检查
if (BaseClass.isAnInstance(object))
{
// Class of object is 'BaseClass' or
// it extends the 'BaseClass'
}
希望这有帮助。
答案 4 :(得分:-1)
了解对象相等性的最佳做法是,如果您在集合中保留对象,则覆盖hashcode()和equals()
您可以参考Why do we have to override the equals() method in Java?