La referencia al método es ambigua cuando se usan lambdas y genéricos
Recibo un error en el siguiente código, que creo que no debería estar allí ... Usando JDK 8u40 para compilar este código.
public class Ambiguous {
public static void main(String[] args) {
consumerIntFunctionTest(data -> {
Arrays.sort(data);
}, int[]::new);
consumerIntFunctionTest(Arrays::sort, int[]::new);
}
private static <T> void consumerIntFunctionTest(final Consumer<T> consumer, final IntFunction<T> generator) {
}
private static <T> void consumerIntFunctionTest(final Function<T, ?> consumer, final IntFunction<T> generator) {
}
}
El error es el siguiente:
Error: (17, 9) java: la referencia a consumerIntFunctionTest es ambigua tanto en el método consumerIntFunctionTest (java.util.function.Consumer, java.util.function.IntFunction) en net.tuis.ubench.Ambiguous y en el método consumerIntFunctionTest (java.util. function.Function, java.util.function.IntFunction) en net.tuis.ubench.Ambiguous match
El error ocurre en la siguiente línea:
consumerIntFunctionTest(Arrays::sort, int[]::new);
Creo que no debería haber ningún error, ya que todosArrays::sort
las referencias son de tipovoid
, y ninguno de ellos devuelve un valor. Como puedes observar,hace trabajo cuando explícitamente amplío elConsumer<T>
lambda
¿Es esto realmente un error en javac, o el JLS establece que la lambda no puede expandirse automáticamente en este caso? Si es lo último, todavía pensaría que es extraño, ya queconsumerIntFunctionTest
con como primer argumentoFunction<T, ?>
No debe coincidir.