对提交的引用不明确: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));
我正在注册一个可调用对象并将其保存到未来的对象中,如下所示:
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));