java - 是否可以在不使用instanceof和getClass的情况下覆盖equals?

标签 java overriding equals

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

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

最佳答案

当然。

使Cow可序列化,并确保其序列化形式是规范的(最坏的情况是实现Externalized并手写自己的规范序列化),然后执行等于中的以下内容:

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

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

这并不容易,效率低下,可能是维护噩梦,并且绝对不应该是您的首选,但它确实表明 Java 代码可以使用一些语言技巧,无需 instanceof 即可进行类型区分Class 相同性检查。

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

关于java - 是否可以在不使用instanceof和getClass的情况下覆盖equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807827/

相关文章:

java - 在 pom.xml 中配置进程类型时 Heroku Webapp 崩溃

java - 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

C# 属性显式设置与覆盖获取

C++ 结合重载和覆盖导致奇怪的行为

java - HashSet 添加了两个对象,它们为 equals() 返回 true 并且在 Java 中具有相同的哈希码

c# - Java "events"- 只不过是接口(interface)。当它只是一个普通的接口(interface)和实现该接口(interface)的类时,为什么还要假装它是事件呢?

java - GWT 入门

c# - 从父类调用子类方法

jquery - 事件后使用 Jquery 均衡高度

java - 如何对列表执行与顺序无关的相等性检查?