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