如果我动态地替代类的equals
和hashCode
方法,则直接调用这些方法调用被覆盖的版本,但将它们用于set将使用未覆盖的版本。为什么它是这样,是否仍然有可能为所有用法动态重写这两种方法?在groovy中动态覆盖`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()? – Will
为什么我需要重写'Set'的equals和'hashcode'? – tig
对不起,有一半人读到这个问题:-) – Will