Java 检查对象是否与此对象属于同一类?

Java 检查对象是否与此对象属于同一类?,java,class,instanceof,Java,Class,Instanceof,我有一个用于Java中多种数据对象类型的基类。我想在基类中创建一个equals方法,该方法在继承时直接工作 相等性由两个对象决定 属于基类的子类。这很容易通过使用 if (!(anObject instanceof BaseClass)) return false; ID字段是由基类定义的,所以我们可以在这里测试它 if (this.id != ((BaseClass) anObject).id) return false; 属于同一阶级的。这就是我的问题所在。两个对象可

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

相等性由两个对象决定

  • 属于基类的子类。这很容易通过使用

    if (!(anObject instanceof BaseClass))
        return false;
    
  • ID字段是由基类定义的,所以我们可以在这里测试它

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

  • 使用


    而不是instanceof。只有当两个对象属于同一个类时,才会返回true(通过引用检查类对象是否相等是安全的)。然后您可以比较id。

    您可以使用
    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'
    }
    

    希望这有帮助。

    了解对象相等性的最佳实践是,如果在集合中维护对象,则重写hashcode()和equals()

    您可以参考实施equals时应阅读的问题


    要使其简短些:使用
    this.getClass()==other.getClass()
    而不是
    的instanceof
    ,因为否则
    equals()
    关系将不可传递(
    superInstance.equals(subInstance)
    将为true,但
    subInstance.equals(superInstance)
    将为false).

    如果我正确理解您的问题,您需要一种方法来区分具有相同id的同一类的两个对象。如果是这样,您可以使用toString(),它提供对象的唯一表示形式,除非它们是字符串对象。当然,您不能在基类中重写toString()。 示例:您可以使用此选项,仅适用于您提到的第三种情况

    if (this.toString()!= anObject.toString())
        return false;
    

    为此,您可以使用
    Object.getClass().equals(this.getClass())
    (假设您指的是类类型,而不是特定实体中的类属性)。您指的是
    this.getClass()
    ?有效的Java非常清楚地表明:试图扩展值对象并维护
    等于
    的契约是非常没有希望的。不,我的问题是关于两个具有相同ID但不同类的对象。这是真的;在我的例子中,基类是抽象的,因此不能有它的实例。所有数据对象都属于子类。
    if (this.toString()!= anObject.toString())
        return false;