2

我想在equals(Object o)不使用instanceof,getClass()和强制转换的情况下覆盖。这在 Java 中是否可行,如果可以,它是如何实现的?编辑:我也想用这个方法。例如:我想在 Cow 类中重写这个方法并用它来检查我的 Cow 是否在逻辑上等于其他 Cow?

谢谢大家的解答。我的主要问题是:如果我将 Car 作为其他类发送给我的奶牛或任何其他对象会发生什么。我如何检查 Object o 是否有方法getName()(假设我的 Cow 有这个方法)?

4

2 回答 2

2

当然。

使Cow序列化,并确保其序列化形式是规范的(最坏的情况是通过实现Externalizable和手写您自己的规范序列化),然后在中执行以下操作equals

  1. 尝试序列化参数。如果失败,则返回 false。
  2. 序列化this
  3. 比较两者的序列化字节。

由于串行形式包括一个标识类型的字符串,它包括区分不同类型实例所需的字节。

这并不容易,效率低下,可能是维护的噩梦,绝对不应该是您的首选,但它确实证明了 Java 代码有一些可用的语言技巧,可以在没有检查instanceofClass相同性检查的情况下进行类型区分。

不过需要注意的是:串行形式不区分在不同类加载器中加载的同名类。

于 2012-12-10T19:41:32.427 回答
1

如果平等的标准仅限于使用只能从对象获得的信息,那当然是可能的。

equals这 / 似乎 / 不太可能......如果你只使用Object's 方法,你为什么要压倒一切?但是,如果这适合您的设计,则没有什么可以阻止您这样做。

只需确保您维护Javadocs 中定义的合同equals()

于 2012-12-10T19:37:49.217 回答