1

次の groovy コードがパスするのはなぜですか?

Executor executor = Executors.newFixedThreadPool(1)
assert executor.submit({"some value"}).get() == null
assert executor.submit({"some value"} as Callable).get() == "some value"

{} instanceof Closure が GroovyCallable を実装すると、Callable が拡張されますか?

as キーワードが提供する黒魔術は何ですか?

4

1 に答える 1

2

まあ、回避する前にRunnableインターフェイスを優先するのは、groovy コンパイラの機能のようです。ClosureCallableAmbiguous method overloading call

ディスカッションhttps://issues.apache.org/jira/browse/GROOVY-4311およびhttps://issues.apache.org/jira/browse/GROOVY-3295をご覧ください。

この問題についてある程度の見通しを得るために、コンパイルに失敗する同様の Java コードを確認できます。

class MyClosure implements Runnable, Callable<String> {

    @Override public String call() throws Exception {
        return "some value";
    }

    @Override public void run() {
    }
}

ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new MyClosure());
于 2013-02-22T03:35:53.377 に答える