提交的引用不明确:executorservice中的submit(callable)和executorservice中的method submit(runnable)匹配

uubf1zoe  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(530)

我正在注册一个callable并将其保存到一个将来的对象中,如下所示:

final Future<SomeObject> objectFuture= Executors.newFixedThreadPool(5).submit(
                    () -> methodReturnsSomeObject(someValue));

我收到以下编译错误,但它是本地生成的:

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /c:/1/5889/001/target/clover/src/com/... reference to submit is ambiguous

java.util.concurrent.executorservice中的方法submit(java.util.concurrent.callable)和java.util.concurrent.executorservice中的方法submit(java.lang.runnable)都匹配
这种情况发生在重载方法中存在歧义时,例如整数。。。和内部。。。根据编译器错误:引用调用不明确。我不明白为什么要在这里展示这个。很明显,我在上面的方法中传递了一个callable。请让我知道它有多模棱两可?另外,由于我的maven构建是在本地传递的,而不是在jenkins中传递的,所以我需要查看jenkins服务器配置吗?提前谢谢
java版本:1.8 maven版本:3.0.5

iecba09b

iecba09b1#

submit() 有两个重载和一个参数。参数都是函数接口,具有以下方法: submit(Callable<T> task) :
T call() submit(Runnable task) : void run() 你的lambda表达式是 () -> methodReturnsSomeObject(someValue) .
如果该方法没有返回任何内容,即 void 方法,它只能实现 Runnable ,所以就不会有歧义了。
但是由于该方法有一个返回值匹配类型 T ( SomeObject 在您的例子中),lambda表达式可以实现 Callable ,但它也可以实现 Runnable 通过忽略/放弃返回值。实施it Callable 当然更可取。
请注意,某些编译器将解析为 Callable ,尤其是编译器的较新版本,它将改进推理处理,因此您不会总是遇到此问题。
若要解决歧义,请强制转换为所需的参数类型。在这种情况下,我们希望 Callable ,所以:

final Future<SomeObject> objectFuture = Executors.newFixedThreadPool(5).submit(
                    (Callable<SomeObject>) () -> methodReturnsSomeObject(someValue));

相关问题