在Groovy中使用闭包实现接口 - 调用了什么方法?

3 groovy closures

在groovy中有一个成语来实现具有单个闭包的接口.必须准备闭包以处理传递的任何参数.这很好.但是如何确定在接口处调用哪种方法?

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = {Object[] args -> println "method called with $args"} as X
x.f()
Run Code Online (Sandbox Code Playgroud)

args是可用的,但被调用的方法的名称 - 显然 - 不是.我错过了什么吗?

dsu*_*rsl 10

我认为Michael Borgwardt基本上是正确的.您通过大括号语法提供的实现提供了一个用于所有接口定义的方法实现:

interface X { void f(); void g(int n); void h(String s, int n); }
x = {Object[] args -> println "method called with $args"} as X

x.f()
x.g(5)
x.h("a string",2)
Run Code Online (Sandbox Code Playgroud)

如果要使用方法实现每个方法的闭包,请使用以下替代语法:

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = [
        f: {println "f is called"},
        g: {int i-> println "g is called with param ${i}"},
        h: {Object[] args -> println "h is called with ${args}"}
] as X

x.f()
x.g(5)
x.h("a string",2)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅以下内容

  • 以这种方式使用闭包的更新的链接:http://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#_map_to_type_coercion (2认同)