Почему Java не жалуется на неоднозначный вызов? - PullRequest
0 голосов
/ 19 января 2019

Сервисный интерфейс объявляет два метода, которые, по-видимому, выполняют одну и ту же обработку:

interface Service<T> {
    <R> R process(Function<? super T, ? extends R> function);
    T process(UnaryOperator<T> operator);
}

Вышеуказанная служба вызывается, как показано ниже:

void process(Service<CharSequence> service) {
    service.process(sequence -> sequence.subSequence(0, 1));
}

Какой из методов службы являетсябудет вызываться, и почему компилятор не жалуется на неоднозначный вызов в этом контексте?

1 Ответ

0 голосов
/ 19 января 2019

При разрешении метода выбирается наиболее специфичный метод сопоставления при наличии нескольких возможных совпадений.Поскольку UnaryOperator<T> расширяет Function<T,T>, если эта лямбда соответствует ей (и соответствует), она более специфична, чем Function<T, T>, поэтому будет использоваться перегрузка UnaryOperator.

...