java 8 lambda不明确的可运行和回调

java 8 lambda不明确的可运行和回调,java,java-8,Java,Java 8,“方法调用不明确。ExecutorService中的submit(可调用)和ExecutorService中的submit(可运行)都匹配。” 如何修复它?我知道我可以使用匿名类,但我想使用函数。在不明确的情况下,显式提供类型: Executors.newFixedThreadPool(3).submit(() -> {doSmth();}); Executors.newFixedThreadPool(3).submit(() -> 1); //Callable Executors

“方法调用不明确。ExecutorService中的submit(可调用)和ExecutorService中的submit(可运行)都匹配。”


如何修复它?我知道我可以使用匿名类,但我想使用函数。

在不明确的情况下,显式提供类型:

Executors.newFixedThreadPool(3).submit(() -> {doSmth();});
Executors.newFixedThreadPool(3).submit(() -> 1); //Callable
Executors.newFixedThreadPool(3).submit(() -> {doSmth();}); //Runnable

在我的IDE(IntelliJ)上工作,没有问题。此外,如果
doSmth
是一个实例方法,则可以将其重写为
Executors.newFixedThreadPool(3).submit(this::doSmth)什么IDE/编译器?你确定你的lambda有块体吗?(
{doSmth();}
而不是
doSmth()
)可能是一个bug。检查这是否是您的问题:也可以在Eclipse上工作,没有编译错误。我认为这与链接副本不同,因为这是一个JDK bug,这是一个“解决歧义”问题……不过,这不应该是必要的。OP有一个块体,因此要使其成为可调用的块体,它需要显式返回一个值。
Executors.newFixedThreadPool(3)。submit(()->1)对于可调用的对象足够了。
Runnable runnable = () -> {doSmth();}
submit(runnable);
//or:
submit((Runnable) () -> {doSmth();});