我已经看到了java equals()方法的许多实现,它们遵循以下几行:
public boolean equals(Object other){
if (this == other)
return true;
//this if code
if (!(other intanceof MyClass))
return false;
//ends here
otherMyClass = (MyClass)other;
//check all the attribute of this and otherMyClass and return true or false
//accordingly
}
在o1.equals(o2)(对于MyClass的o1对象和MyClasss的子类的o2对象)中它将返回true的意义上是不是代码有问题?在大多数情况下,这不是预期的行为。
other.getClass() != this.getClass()
不是一个更好的比较而不是上面的粗体吗?
答案 0 :(得分:2)
o.getClass() != getClass())
违反Liskov替代原则。
引用一位伟人:
Liskov替代原则说任何重要的财产 一个类型也应该为其子类型保留,以便编写任何方法 对于该类型应该在其子类型上同样有效。
本书Effective Java
有关于此主题的更多详细信息。
答案 1 :(得分:0)
if (!(other intanceof MyClass)) return false
是不同类的实例,则返回false。
我无法遵循关于返回true的逻辑,因为它无法返回true。它可以评估为true,在这种情况下会执行下一个语句。
答案 2 :(得分:0)
我认为@ChrisForrence(+1)在评论中引用了最佳答案:Any reason to prefer getClass() over instanceof when generating .equals()?
我想提醒您注意使用instanceof
使equals()
实现不对称:如果A是基类而B扩展A而不定义任何其他字段或方法,则可以{ {1}} a.equals(b) == true
其中b.equals(a) == false
是a
的实例,A
是b
的实例。
答案 3 :(得分:0)
我在一年前的一次采访中确实遇到过这个问题。我的实现也是使用instanceof。我的面试官提到了使用getClass()== other.getClass()的两个论点: