将带有 .& 运算符的参数传递给静态方法

Pass param with .& operator to a static method

使用 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 是什么版本?这适用于 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'

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

在下面的代码中,在我的控制台 (ConsoleScript8) 的第 8th 执行中,y 定义了不带参数的方法 hello()(添加了 "script number" 明确表示):

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:

会更容易
class Greeter {
    def static hello(name='Joe') {
        "Hello ${name}"
    }
}

def hi = Greeter.&hello
assert hi() == 'Hello Joe'
assert hi('Tom') == 'Hello Tom'