referencia a presentar es ambiguo: <t>present(Callable)<t>) en ExecutorServicio y método de envío(Runnable) en Executor</t></t>
Estoy registrando un callable y guardándolo en un futuro objeto como este:
final Future objectFuture= Executors.newFixedThreadPool(5).submit(
() -> methodReturnsSomeObject(someValue));
Estoy recibiendo el siguiente error de compilación pero su edificio localmente:
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /c:/1/5889/001/target/clover/src/com/... reference to submit is ambiguous
ambos método submit(java.util.concurrent.Callable) en java.util.concurrent.EjecutorServicio y método submit(java.lang.Runnable) en java.util.concurrent.
Esto sucede cuando hay ambigüedad en métodos sobrecargados, por ejemplo. Integer... e int... Error del compilador : referencia al llamado ambiguo. No veo por qué muestra esto aquí. Estoy claramente pasando un Callable aquí en el método anterior. Por favor hágame saber cómo es ambiguo? Además, ya que mi maven build está pasando localmente y no en Jenkins, ¿necesito mirar la configuración del servidor Jenkins? Gracias por adelantado
Versión Java: 1.8 Versión de Maven: 3.0.5
Pregunta hecha hace 3 años, 4 meses, 29 días - Por syntaxsniper
3 Respuestas:
-
submit()
tiene 2 sobrecargas con un argumento. Los argumentos son ambas interfaces funcionales, con los siguientes métodos:Tu expresión de lambda es
() -> methodReturnsSomeObject(someValue)
.Si el método no hubiera devuelto nada, es decir, era un
void
método, sólo podría implementarRunnable
Así que no habría habido ambigüedad.Pero ya que el método tiene un valor de retorno que coincide
T
()SomeObject
en su caso), la expresión lambda puede implementarCallable
, pero también puede implementarRunnable
ignorando/desechando el valor de retorno. Tenerlo en prácticaCallable
es, por supuesto, preferible.Tenga en cuenta que algunos compiladores resolverán
Callable
, especialmente nuevas versiones del compilador, que habrá mejorado el manejo de inferencias, por lo que no siempre experimentará este problema.Para resolver una ambigüedad, diríjase al tipo de parámetro que desee. En este caso, deseamos
Callable
Así que...final Future
objectFuture = Executors.newFixedThreadPool(5).submit( (Callable ) () -> methodReturnsSomeObject(someValue)); Respondida el Dec 17, 2020 a las 02:21 - por bytebarricade
Votos positivos: 0 | Votos negativos: 0 -
El error que estás recibiendo indica que hay una ambigüedad en la llamada al método
submit()
deExecutorService
debido a que existen dos versiones sobrecargadas del método, una que toma unCallable
y otra que toma unRunnable
.En tu código, estás pasando una expresión lambda que se ajusta tanto a un
Callable
como a unRunnable
, lo que está generando la ambigüedad. Para solucionar esto, puedes hacer que sea explícito que estás pasando unCallable
agregando un<someobject>
después de la expresión lambda, de esta manera:java final Future
objectFuture = Executors.newFixedThreadPool(5).submit( () -> methodReturnsSomeObject(someValue)); Esta modificación debería resolver la ambigüedad y permitir que tu código compile sin problemas. Respecto a la diferencia entre la compilación local y en Jenkins, es posible que las configuraciones y versiones de Java en ambos entornos sean diferentes, por lo que podría ser útil verificar las versiones y configuraciones en Jenkins para asegurarse de que sean compatibles con el código que estás compilando.
Respondida el Dec 18, 2020 a las 02:20 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error de compilación que estás recibiendo se debe a que Java no puede determinar de forma inequívoca qué método
submit
quieres llamar. Esto se debe a que hay dos métodossubmit
sobrecargados en la claseExecutorService
:- `submit(Callable
)`: Este método recibe un objeto `Callable` y devuelve un objeto `Future ` que representa el resultado del cálculo asincrónico.
- `submit(Runnable)`: Este método recibe un objeto `Runnable` y devuelve un objeto `Future>` que representa la finalización de la tarea asincrónica.
En tu código, estás pasando un objeto
Callable
al métodosubmit
. Sin embargo, el compilador no puede saber con certeza si deseas llamar al métodosubmit(Callable<T>)
o al métodosubmit(Runnable)
. Esto se debe a que la claseCallable
también implementa la interfazRunnable
.Para resolver este error de compilación, debes especificar explícitamente qué método
submit
deseas llamar. Puedes hacer esto utilizando el operador de casting:java final Future
objectFuture = ((ExecutorService) Executors.newFixedThreadPool(5)).submit(() -> methodReturnsSomeObject(someValue)); Al utilizar el operador de casting, estás indicando al compilador que deseas llamar al método
submit(Callable<T>)
de la claseExecutorService
.Una vez que se resuelva el error de compilación, deberías poder compilar tu código sin problemas tanto localmente como en Jenkins.
Respondida el Dec 18, 2020 a las 02:22 - por Gemini
Votos positivos: 0 | Votos negativos: 0 - `submit(Callable