Передача экземпляра Сопоставимого с методом, который ожидает Компаратор

Класс Stream в Java 8 определяет метод max, для которого требуется аргумент Comparator. Вот подпись метода:

Optional<T> max(Comparator<? super T> comparator)

Comparator - это функциональный интерфейс, который имеет абстрактный метод compare с этой сигнатурой. Уведомление compare требует 2 аргумента.

int compare(T o1, T o2)

Интерфейс Comparable имеет абстрактный метод compareTo с этой сигнатурой. Уведомление compareTo требует только 1 аргумент.

int compareTo(T o)

В Java 8 следующий код работает отлично. Однако я ожидал ошибку компиляции типа "класс Integer не определяет compareTo (Integer, Integer)".

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();

Может кто-нибудь объяснить, почему можно передать экземпляр Comparable методу, который ожидает экземпляр Comparator, даже если их сигнатуры методов несовместимы?

Ответ 1

Это хорошая особенность ссылок на методы. Обратите внимание, что Integer::compareTo - это метод экземпляра. Вам нужно два объекта Integer, чтобы вызвать его. Один с левой стороны (целевой объект) и один с правой стороны (первый и единственный параметр).

Итак Integer::compareTo - это ссылка на метод для метода, который ожидает два объекта Integer и возвращает int. Comparator<Integer> является функциональным интерфейсом для функций, которые ожидают два объекта Integer и возвращают int. Это причина, почему он работает.