对提交的引用不明确:ExecutorService 中的 <T>submit(Callable<T>) 和 ExecutorService 中的方法 submit(Runnable) 匹配

reference to submit is ambiguous: <T>submit(Callable<T>) in ExecutorService and method submit(Runnable) in ExecutorService match

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

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) 匹配

当重载方法中存在歧义时会发生这种情况,例如整数...和整数...根据 Compiler error : reference to call ambiguous。我不明白为什么它会在这里显示。我在上面的方法中显然在这里传递了一个 Callable 。请让我知道它是如何模棱两可的?此外,由于我的 Maven 构建是在本地传递而不是在 Jenkins 中传递,我是否需要查看 Jenkins 服务器配置?提前致谢

Java版本:1.8 Maven 版本:3.0.5

submit() 有 2 个重载和一个参数。参数都是函数式接口,方法如下:

你的 lambda 表达式是 () -> methodReturnsSomeObject(someValue).

如果方法没有 returned 任何东西,即是一个 void 方法,它只能实现 Runnable,所以不会有歧义。

但是由于该方法有一个return值匹配类型T(在你的例子中是SomeObject),lambda表达式可以实现Callable,但它也可以通过 ignoring/discarding return 值实现 Runnable。让它实现 Callable 当然更好。

请注意,某些编译器会解析为 Callable,尤其是较新版本的编译器,它们会改进推理处理,因此您不会总是遇到此问题。

要解决歧义,请转换为所需的参数类型。在这种情况下,我们希望Callable,所以:

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