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