检查一个对象是否与此类相同?

时间:2013-11-18 16:00:47

标签: java class instanceof

我在Java中有多个数据对象类型的基类。我想在基类中创建一个equals方法,它在继承时直接工作。

平等由两个对象决定

  1. 属于基类的子类。使用

    可以轻松实现
    if (!(anObject instanceof BaseClass))
        return false;
    
  2. 具有相同的ID。 ID字段由基类定义,因此我们可以在此测试。

    if (this.id != ((BaseClass) anObject).id)
        return false;
    
  3. 属于同一个班级。这就是我遇到问题的地方。两个对象可以是不同类型的(因此可以在不同的列表中),但具有相同的ID。我必须能够区分它们。我怎么能这样做?

5 个答案:

答案 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?