Invoke method as closure

closures, groovy

Solution

When converting a method to a closure using .& notation you leave off the parameters. f.&method(6) is the same as calling f.method(6) which will return 16, so in your example you are passing 16 into invokeClosure and not a closure. Which causes the following exception since the Integer class doesn't have a call method:

Exception thrown: No signature of method: java.lang.Integer.call()

Below passes a method pointer for f.method into invokeClosure and would be how you would typically use .&.

class Foo {
  def method(def param) {
    param + 10
  }
}

def invokeClosure = {Closure closure ->
   return closure.call(6) // can leave off .call
}

def f = new Foo()
invokeClosure f.&method

As you pointed out the following will work:

invokeClosure {f.method(6)}

That's because you are passing a closure that takes no parameters so that's why closure.call() works in that case.

Problem

My understanding of the Groovy operator `.&` is that it converts a method call to a closure. Therefore it seems like the following code (which can be run in the Groovy console) should work: ``` class Foo { def method(def param) { param + 10 } } def invokeClosure = {Closure closure -> return closure.call() } def f = new Foo() invokeClosure f.&method(6) ``` Of course if I change the last line to ``` invokeClosure {f.method(6)} ``` it works fine, but what's wrong with my understanding of the `.&` operator? Thanks, Don

Original source