我正在注册一个可调用对象,并将其保存到未来的对象中,如下所示:
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.courrent.ExecutorService中的方法submit(java.util.concurrent.Callable(和java.util.cocurrent.ExecutorService中的方法submit(java.lang.Runnable(都匹配
当重载方法中存在歧义时,就会发生这种情况,例如Integer。。。和int…根据编译器错误:调用的引用不明确。我不明白为什么它在这里显示这个。在上面的方法中,我显然是在传递一个Callable。请让我知道它是如何模棱两可的?此外,由于我的maven构建是本地传递的,而不是在Jenkins中传递的,我需要查看Jenkins服务器配置吗?提前感谢
Java版本:1.8Maven版本:3.0.5
submit()
有两个带有一个参数的重载。自变量都是函数接口,具有以下方法:
submit(Callable<T> task)
:T call()
submit(Runnable task)
:void run()
您的lambda表达式是() -> methodReturnsSomeObject(someValue)
。
如果该方法没有返回任何内容,即void
方法,它只能实现Runnable
,因此不会有歧义。
但是,由于该方法的返回值匹配类型T
(在您的情况下为SomeObject
(,lambda表达式可以实现Callable
,但也可以通过忽略/丢弃返回值来实现Runnable
。让它实现Callable
当然是优选的。
请注意,某些编译器将解析为Callable
,尤其是较新版本的编译器,它将改进推理处理,因此您不会总是遇到此问题。
若要解决歧义,请强制转换为所需的参数类型。在这种情况下,我们需要Callable
,因此:
final Future<SomeObject> objectFuture = Executors.newFixedThreadPool(5).submit(
(Callable<SomeObject>) () -> methodReturnsSomeObject(someValue));