7

リストを作成して、代わりに複数の変数であるクロージャ署名の引数として使用することは可能ですか?その理由は、Javaコードからクロージャを呼び出さなければならず、JavaコードはGroovyクロージャに必要な変数を認識しないためです。

これは、例を使用した方が適切です。

「クロージャーリポジトリ」があり、クロージャーごとに異なる署名があるとします。例えば:

closures = [
    closureA: { int a, String b ->
        a.times {
            System.err.println(b);
        }
    },
    closureB: { int a, int b, String c ->
        (a+b).times {
            System.err.println(c);
        }
    }
]

次に、これらのクロージャを呼び出すためにJavaコードに公開しているメソッドがあります。

def tryClosureExpansion(String whichClosure, Object ... args) {
    def c = closures[whichClosure]
    c.call(args)     // DOESNT COMPILE !
}

そして、Javaの場合、このメソッドを次のように呼び出します。

// these calls will happen from Java, not from Groovy
tryClosureExpansion("closureA", 1, "Hello");
tryClosureExpansion("closureB", 1, 5, "Hello more");

コンパイルされない行については、上記を参照してください。groovyはこのようなものを処理するのに十分な「groovy」のように感じます。飛ぶかもしれない代替案はありますか?

4

1 に答える 1

11

行う:

c.call( *args )

仕事?それをテストするためのコンピューター ATM ではありません

于 2012-05-08T21:08:05.520 に答える