如何将基类对象与派生类中的派生类对象进行比较?我需要将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
作为输出。如何将基类与派生类进行比较?
答案 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, b2
和str
值相等,您可能希望两个对象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;
}
在您的情况下,由于Base
和Derived
是不同的类,因此具有不同的属性(Base
具有str
和i
,而Derived
有str
,i
,str1
和d
),您需要准确定义Base
对象和Derived
的确切时间对象应该是平等的。