A referência ao método é ambígua ao usar lambdas e genéricos
Estou recebendo um erro no código a seguir, que acredito que não deveria estar lá ... Usando o JDK 8u40 para compilar esse 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) {
}
}
O erro é o seguinte:
Erro: (17, 9) java: a referência a consumerIntFunctionTest é ambígua, tanto no método consumerIntFunctionTest (java.util.function.Consumer, java.util.function.IntFunction) em net.tuis.ubench.Ambiguous e no método consumerIntFunctionTest (java.util. function.Function, java.util.function.IntFunction) em net.tuis.ubench.Ambiguous match
O erro ocorre na seguinte linha:
consumerIntFunctionTest(Arrays::sort, int[]::new);
Eu acredito que não deve haver erro, pois todosArrays::sort
referências são do tipovoid
, e nenhum deles retorna um valor. Como você pode observar,faz trabalhar quando eu expandir explicitamente oConsumer<T>
lambda.
Isso realmente é um bug no javac ou o JLS afirma que o lambda não pode ser expandido automaticamente nesse caso? Se for o último, eu ainda acho estranho, poisconsumerIntFunctionTest
com como primeiro argumentoFunction<T, ?>
não deve corresponder.