有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    Is this a bug or am I doing something wrong?

    我不认为这是一个bug(可能有争议),但它的行为可能并不明显

    因为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']
        }
    }
    

    你可能不想这么做是有原因的,但我希望这能解决你的问题