Ссылка на метод неоднозначна при использовании лямбд и дженериков

Я получаю сообщение об ошибке в следующем коде, которого, по моему мнению, быть не должно ... Использование 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, ?> не должно совпадать.

Ответы на вопрос(1)

Ваш ответ на вопрос