对提交的引用不明确:在执行器服务中提交<T>(可调用)<T>和在执行器服务匹配中提交(可运行)



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

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));

相关内容

  • 没有找到相关文章

最新更新