2009-05-04 5 views
3

groovyには、単一のクロージャーでインターフェイスを実装するイディオムがあります。クロージャは、渡された引数が何であれ処理する準備が必要です。それはうまく動作します。しかし、どのメソッドがインタフェースで呼び出されたかはどのように決定されますか?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は利用可能ですが、呼び出されたメソッドの名前は明らかにそうではありません。何か不足していますか?

答えて

1

このExcample http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing

に示すようにあなたは、インタフェースmethodesへのコールを処理することができフォールバックメソッドを実装することができますこれにより、ダイナミックMethodMissing機能を使用することができます。

+0

外部リンクはもう存在しません。 – m0skit0

1

この機能は、ComparableまたはRunnable(Javaではクロージャの代用としてよく使用される)などの単一メソッドインタフェースの一般的なケースで使用することを意図しています。

9

私はマイケルボルグワルトが本質的に正しいと思います。あなたはメソッドごとにメソッドの実装で閉鎖を作りたい場合は、この代替構文を使用し

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) 

:あなたは中括弧構文を経由して提供実装はALL インターフェース定義のために使用されている1つのメソッド実装を提供します:

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) 

詳細については、以下を参照してください:

+2

このようにクロージャを使用するための最新のリンク:http://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#_map_to_type_coercion –

関連する問題