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

时间:2009-05-04 14:03:19

标签: 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()

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

3 个答案:

答案 0 :(得分:9)

我认为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)

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

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)

有关详细信息,请参阅以下内容:

答案 1 :(得分:1)

您可以使用此Excample中显示的动态MethodMissing功能 http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing

通过这个,你可以实现一个回退方法,它可以处理对接口方法的调用。

答案 2 :(得分:1)

该功能旨在用于单方法接口的常见情况,例如ComparableRunnable(Java中常用它们作为闭包的替代)。