【问题标题】:Pass param with .& operator to a static method将带有 .& 运算符的参数传递给静态方法
【发布时间】:2016-01-16 03:06:34
【问题描述】:

使用 groovy .& operator 可以创建对静态方法的引用,如

def static xyz( name='Joe' ) {
 println "Hello ${name}"
}

// NOTE: ConsoleScript number part varies
def ref = ConsoleScript52.&xyz

并且可以在没有参数的情况下轻松调用,如

ref()  // prints "Hello "

但是如何用参数调用这个方法呢? ref('John') 给出错误groovy.lang.MissingMethodException: No signature of method: ConsoleScript52.xyz() is applicable for argument types: (java.lang.String) values: [John]

请注意,当使用 ref 调用静态方法时,Groovy 甚至不使用上面示例中 name 参数的默认值。

【问题讨论】:

    标签: groovy static-methods


    【解决方案1】:

    您可能正在使用 ConsoleScript 实例,而您没有使用参数定义该方法。

    在下面的代码中,在我的控制台 (ConsoleScript8) 中的第 8th 执行中,定义了不带参数的方法 hello()(添加了 “脚本编号”明确):

    println this.getClass().getName()
    println ''
    
    def static hello() {
        println "(8) Hello"
    }
    
    def h8 = ConsoleScript8.&hello
    h8()
    h8('Joe')
    

    它会在下一次执行中产生以下结果:

    ConsoleScript9
    
    (8) Hello
    Exception thrown
    
    groovy.lang.MissingMethodException: No signature of method: ConsoleScript9.hello() is applicable for argument types: (java.lang.String) values: [Joe]
    

    并且在第 10 次 执行中 (ConsoleScript10) 我对其进行了修改,添加了默认参数:

    println this.getClass().getName()
    println ''
    
    def static hello(name='amigo') {
        println "(10) Hello ${name}"
    }
    
    def h10 = ConsoleScript10.&hello
    h10()
    h10('Joe')
    
    println '--'
    
    def h8 = ConsoleScript8.&hello
    h8()
    h8('Joe')
    

    它产生:

    ConsoleScript12
    
    (10) Hello amigo
    (10) Hello Joe
    --
    (8) Hello
    Exception thrown
    
    groovy.lang.MissingMethodException: No signature of method: ConsoleScript8.hello() is applicable for argument types: (java.lang.String) values: [Joe]
    

    如果你使用显式类会更容易:

    class Greeter {
        def static hello(name='Joe') {
            "Hello ${name}"
        }
    }
    
    def hi = Greeter.&hello
    assert hi() == 'Hello Joe'
    assert hi('Tom') == 'Hello Tom'
    

    【讨论】:

    • 你是对的,问题是通过使用显式类解决的。
    【解决方案2】:

    什么版本的 Groovy?这适用于 Groovy 2.4.5:

    class Test {
        static greet(name = 'tim') {
            "Hello ${name.capitalize()}"
        }
    }
    
    // regular static calls
    assert Test.greet()             == 'Hello Tim'
    assert Test.greet('kaskelotti') == 'Hello Kaskelotti'
    
    // Create a reference to the static method
    def ref = Test.&greet
    
    // Calling the reference works as well
    assert ref()             == 'Hello Tim'
    assert ref('kaskelotti') == 'Hello Kaskelotti'
    

    【讨论】:

    • 对不起,蒂姆,你和上面的@jalopaba 一样正确,但速度有点慢:)。当直接定义静态方法而不是像您的示例中那样将其作为类的一部分时,就会出现问题。
    • 而 groovy 控制台声明它的版本是 2.4.5
    • @kaskelotti 我实际上快了大约 2 分钟 :-) 很高兴它已排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多