Ссылка на метод неоднозначна при использовании лямбд и дженериков
Я получаю сообщение об ошибке в следующем коде, которого, по моему мнению, быть не должно ... Использование JDK 8u40 для компиляции этого кода.
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) {
}
}
Ошибка заключается в следующем:
Ошибка: (17, 9) java: ссылка на consumerIntFunctionTest является неоднозначной как для метода consumerIntFunctionTest (java.util.function.Consumer, java.util.function.IntFunction) в net.tuis.ubench. function.Function, java.util.function.IntFunction) в net.tuis.ubench.Ambiguous match
Ошибка возникает в следующей строке:
consumerIntFunctionTest(Arrays::sort, int[]::new);
Я считаю, что не должно быть никакой ошибки, так как всеArrays::sort
ссылки имеют типvoid
и ни один из них не возвращает значение. Как вы можете наблюдать, этоделает работать, когда я явно расширяюConsumer<T>
лямбда.
Это действительно ошибка в javac, или JLS заявляет, что лямбда не может быть автоматически расширена в этом случае? Если бы это был последний, я бы все равно подумал, что это странно, так какconsumerIntFunctionTest
с первым аргументомFunction<T, ?>
не должно совпадать.