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

好吧,它看起来像是 groovy 编译器的一个特性,它喜欢在之前使用Runnable接口来避免.ClosureCallableAmbiguous method overloading call

请查看讨论https://issues.apache.org/jira/browse/GROOVY-4311https://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 回答