Информация об изменениях

Сообщение Ambigous method call с Lambda от 11.07.2021 14:15

Изменено 11.07.2021 14:17 vsb

Ambigous method call с Lambda
Не очень понимаю, почему так происходит.

    <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


Не очень понятно, почему так происходит. Первые три варианта компилируются. Чем второй или третий вариант отличается от четвёртого?
Ambigous method call с Lambda
Не очень понимаю, почему так происходит.

    <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.