【问题标题】:How to override equals when extending LinkedHashMap in groovy在groovy中扩展LinkedHashMap时如何覆盖equals
【发布时间】:2017-11-26 19:18:35
【问题描述】:

根据文档,== 运算符调用 equals 方法。 groovy 中的地图似乎并非如此。这是一个错误还是我做错了什么?

当一个类扩展 LinkedHashMap 并覆盖 equals 时

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

【问题讨论】:

标签: java groovy


【解决方案1】:

这是一个错误还是我做错了什么?

我不认为这是一个错误(可能值得商榷),但它的行为可能并不明显。

由于 Groovy 的动态调度在运行时类型上进行,您的 equals(Object) 不会被调用,因为 Groovy 为 Map 实例提供了自定义的 equals(Map) 方法,这将胜过 equals(Object)。使您的断言按照您期望的方式运行的一种方法是提供一个equals(Map) 方法。

class CustomDelegate {
    @Delegate
    LinkedHashMap map = [:]

    boolean equals(Map o) {
        false
    }

    static void main(args) {
        def customDelegate = new CustomDelegate()
        customDelegate.put('key', 'value')

        // both of these will pass...
        assert [key: 'value'] == customDelegate
        assert customDelegate != [key: 'value']
    }
}

您可能并不真的想这样做,但我希望这能解决您的问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
相关资源
最近更新 更多