如何优雅地处理groovy模糊方法重载

时间:2017-06-09 09:07:53

标签: groovy

我知道有类似的问题,但答案并不令人满意。

当调用以null作为参数的方法时,我得到了一个Groovy模糊方法重载错误。

例如:

class A{
    sampleMethod (B bObj){
        if(bObj == null) {
            handleNullArgumentGracefully()
        }
        ... do some cool stuff ...
    }

    sampleMethod (C cObj){
        ... do some other cool stuff ...
    }
}

现在当我调用sampleMethod(null)时,groovy不知道它应该调用哪个方法。那清楚但是有可能将这两个方法中的一个设置为默认方法来处理这样的空调用吗?我想在来电方面处理此问题,在来电方方面处理(我不想在来电方投出某些内容)< / p>

更新 我找到了一个解决方案,它如何工作,但我不知道为什么:将非默认方法转换为闭包属性

class app {
    static void main(String[] args) {
        def a = new A()
        a.sampleMethod(new B())
        a.sampleMethod(new C())
        a.sampleMethod(null)
    }
}

class A {
    def sampleMethod(B bObj = null) {
        if (bObj == null) {
            println("handle null")
        }
        println("1")
    }

    def sampleMethod = { C cObj ->
        println("2")
    }
}

class B {

}

class C {

}

1 个答案:

答案 0 :(得分:1)

以下内容将因Ambiguous method overloading for method A#sampleMethod

而失败
class A{
    def sampleMethod (Number o=null){
        println "num $o"
    }

    def sampleMethod (String o){
        println "str $o"
    }
}

new A().sampleMethod(null)

这个将起作用(对象将被调用为null):

class A{
    def sampleMethod (Number o=null){
        println "num $o"
    }

    def sampleMethod (String o){
        println "str $o"
    }

    def sampleMethod(Object o){
        println "obj $o"
    }
}

new A().sampleMethod(null)

但我喜欢这个:

class A{
    def _sampleMethod (Number o){
        println "num $o"
    }

    def _sampleMethod (String o){
        println "str $o"
    }

    def sampleMethod(Object o){
        if(o==null){
            println "null"
            return null
        }else if(o instanceof Number){
            return _sampleMethod ((Number) o)
        }else if(o instanceof String){
            return _sampleMethod ((String) o)
        }
        throw new IllegalArgumentException("wrong argument type: ${o.getClass()}")
    }
}

new A().sampleMethod(null)