传递param。&运算符到静态方法

时间:2015-10-17 11:31:24

标签: groovy static-methods

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

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

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

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

ref()  // prints "Hello "

但是如何使用params调用此方法? ref('John')发出错误groovy.lang.MissingMethodException: No signature of method: ConsoleScript52.xyz() is applicable for argument types: (java.lang.String) values: [John]

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

2 个答案:

答案 0 :(得分:1)

什么版本的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'

答案 1 :(得分:1)

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

在下面的代码中,在我的控制台(ConsoleScript8)中的第8次执行中,y定义了没有参数的方法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'