java在groovy中扩展LinkedHashMap时如何重写equals
根据文档==
操作符调用equals方法。groovy中的映射似乎不是这样。这是一个错误还是我做错了什么
当类扩展LinkedHashMap并重写等于
class CustomExtend extends LinkedHashMap<String, String> {
@Override
boolean equals(Object o) {
false
}
}
def customExtend = new CustomExtend()
customExtend.put('key', 'value')
assert [key:'value'] == customExtend
assert customExtend == [key:'value']//should be false
我尝试的另一个策略是授权
class CustomDelegate {
@Delegate
LinkedHashMap map = [:]
@Override
boolean equals(Object o) {
false
}
}
def customDelegate = new CustomDelegate()
customDelegate.put('key', 'value')
assert [key:'value'] == customDelegate
assert customDelegate == [key:'value']//should be false
# 1 楼答案
我不认为这是一个bug(可能有争议),但它的行为可能并不明显
因为Groovy的动态分派是在运行时类型上分派的,所以不会调用
equals(Object)
,因为Groovy为Map
实例提供了一个自定义的equals(Map)
方法,这将赢得equals(Object)
。使断言按预期方式运行的一种方法是提供equals(Map)
方法你可能不想这么做是有原因的,但我希望这能解决你的问题