Dynamic 为什么我需要在提交给执行人的结案时使用as Callable?

Dynamic 为什么我需要在提交给执行人的结案时使用as Callable?,dynamic,concurrency,groovy,Dynamic,Concurrency,Groovy,为什么下面的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 extenses Callab

为什么下面的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 extenses Callable时


as关键字提供了什么黑魔法?

好吧,groovy编译器的一个特性是在
Closure
之前选择
Runnable
接口
Callable
,以避免
方法重载调用不明确

请看一下讨论和讨论

要了解问题的一些观点,您可以查看类似的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());
类MyClosure实现可运行、可调用的{
@重写公共字符串调用()引发异常{
返回“某个值”;
}
@重写公共无效运行(){
}
}
ExecutorService ExecutorService=Executors.newSingleThreadExecutor();
executorService.submit(新的MyClosure());