如果我动态覆盖一个类的
equals
和hashCode
方法,直接调用这些方法会调用重写的版本,但是在使用它们进行设置时,会使用未重写的版本。为什么会这样,并且是否仍然可以动态覆盖这两个方法以供所有用途使用?class SuperClass {
public boolean equals(Object other) {
println 'non overridden equals called'
false
}
public int hashCode() {
println 'non overridden hashCode called'
1
}
}
SuperClass.metaClass.equals = { Object other ->
println 'overridden equals called'
true
}
SuperClass.metaClass.hashCode = { ->
println 'overridden hashCode called'
1
}
def a = new SuperClass()
def b = new SuperClass()
println a.hashCode() // overriden hashCode called
println b.hashCode() // overriden hashCode called
println a.equals(b) // overriden equals called
println([a, b].toSet().size()) // non overriden methods called, returns 2 instead of 1
Set
的 equals() 和 hashcode() 方法吗? - WillSet
的equals
和hashcode
方法? - tig