在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可用,但被调用的方法的名称 - 显然 - 不是。我错过了什么吗?
答案 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)
该功能旨在用于单方法接口的常见情况,例如Comparable
或Runnable
(Java中常用它们作为闭包的替代)。