如何比较派生类对象与基类对象java?

时间:2010-09-21 05:19:01

标签: java

如何将基类对象与派生类中的派生类对象进行比较?我需要将true作为以下代码的输出:

class Base {
    int i;
    String str;
}

class Derived extends Base{
    double d;
    String str1;

    public static void main(String []a){
        Base b= new Base();
        Derived d = new Derived();
        System.out.println("Equals! :"+d.equals(b));
    }
}

它始终以false作为输出。如何将基类与派生类进行比较?

2 个答案:

答案 0 :(得分:1)

好吧,让它回归真实很容易:

@Override
public boolean equals(Object other) {
    return true;
}

但是,我认为这不是你应该做的事情(即使是在一些不那么简单的实现中)。

我认为来自equals的{​​{1}}方法不应该返回Object,除非类型实际上是相同的。否则,在确保true所需的对称性方面得到满足方面,它最终会使生活变得非常棘手。在这一点上,它也不觉得它正在实现自然平等。

但是,编写一个能够在特定情况下比较任何两个Object.equals(Object)实例的类是完全合理的。关于平等比较器的好处在于它们不必如此自然 - 你没有定义平等对于整个类型应该意味着什么 - 你只是描述了一个特定的比较。

令人遗憾的是,Java没有Base(或其他)接口与EqualityComparator<T>一起使用。这使得创建(比方说)使用特定的相等概念(和哈希代码)的地图和集合变得更加困难。在你的情况下,这可能是也可能不是问题 - 你怎么希望使用这种平等比较呢?如果它在您自己的代码中,您可以编写自己的Comparator<T>接口。如果您要构建地图或集合,那就不会那么容易:(

答案 1 :(得分:1)

通常为同一个类的对象定义对象相等性,例如:如果Base b1, b2str值相等,您可能希望两个对象i相等。然后,您需要定义equals()(通常是hashCode())方法来测试此条件。例如:

public boolean equals(Object obj)
{
    // test for identity
    if (this == obj) return true;

    // check that obj is not null, and that it is an instance of Base
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;

    // compare attributes
    Base other = (Base) obj;
    if (i != other.i) return false;
    if (str == null && other.str != null) return false;
    if (!str.equals(other.str)) return false;
    return true;
}

在您的情况下,由于BaseDerived是不同的类,因此具有不同的属性(Base具有stri,而Derivedstristr1d),您需要准确定义Base对象和Derived的确切时间对象应该是平等的。