使用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的默认值。
答案 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'