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()
参数可用,但被调用的方法的名称 - 显然 - 不是。我错过了什么吗?
我认为迈克尔·博格沃特基本上是对的。您通过大括号语法提供的实现提供了一种用于所有接口定义的方法实现:
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)
有关详细信息,请参阅以下内容:
您可以使用此示例http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing中所示的动态 MethodMissing 功能
有了这个,您可以实现一个回退方法,该方法可以处理对接口方法的调用。
该功能旨在用于单方法接口的常见情况,例如Comparable
or Runnable
(在 Java 中通常用作闭包的替代品)。