我想在equals(Object o)
不使用instanceof
,getClass()
和强制转换的情况下覆盖。这在 Java 中是否可行,如果可以,它是如何实现的?编辑:我也想用这个方法。例如:我想在 Cow 类中重写这个方法并用它来检查我的 Cow 是否在逻辑上等于其他 Cow?
谢谢大家的解答。我的主要问题是:如果我将 Car 作为其他类发送给我的奶牛或任何其他对象会发生什么。我如何检查 Object o 是否有方法getName()
(假设我的 Cow 有这个方法)?
我想在equals(Object o)
不使用instanceof
,getClass()
和强制转换的情况下覆盖。这在 Java 中是否可行,如果可以,它是如何实现的?编辑:我也想用这个方法。例如:我想在 Cow 类中重写这个方法并用它来检查我的 Cow 是否在逻辑上等于其他 Cow?
谢谢大家的解答。我的主要问题是:如果我将 Car 作为其他类发送给我的奶牛或任何其他对象会发生什么。我如何检查 Object o 是否有方法getName()
(假设我的 Cow 有这个方法)?
当然。
使Cow
序列化,并确保其序列化形式是规范的(最坏的情况是通过实现Externalizable
和手写您自己的规范序列化),然后在中执行以下操作equals
:
this
。由于串行形式包括一个标识类型的字符串,它包括区分不同类型实例所需的字节。
这并不容易,效率低下,可能是维护的噩梦,绝对不应该是您的首选,但它确实证明了 Java 代码有一些可用的语言技巧,可以在没有检查instanceof
或Class
相同性检查的情况下进行类型区分。
不过需要注意的是:串行形式不区分在不同类加载器中加载的同名类。
如果平等的标准仅限于使用只能从对象获得的信息,那当然是可能的。
equals
这 / 似乎 / 不太可能......如果你只使用Object
's 方法,你为什么要压倒一切?但是,如果这适合您的设计,则没有什么可以阻止您这样做。
只需确保您维护Javadocs 中定义的合同equals()