Не очень понимаю, почему так происходит.
<R> R f0(Function<Integer, R> function) {
return function.apply(0);
}
void f0(Consumer<Integer> consumer) {
consumer.accept(0);
}
String x(String s, Integer i) {
return s + i;
}
void test() {
f0(i -> {});
f0(i -> { return x("", i); });
f0(i -> "" + i);
f0(i -> x("", i)); // java: reference to f0 is ambiguous
}
Полный текст ошибки компиляции:
java: reference to f0 is ambiguous
both method <R>f0(java.util.function.Function<java.lang.Integer,R>) in Test and method f0(java.util.function.Consumer<java.lang.Integer>) in Test match
Не очень понятно, почему так происходит. Первые три варианта компилируются. Чем второй или третий вариант отличается от четвёртого? С чего это вдруг вызов функции, которая возвращает значение, может подходить под перегрузку с Consumer.