Ссылка на методы с разными параметрами в Java8
Мне интересно, как все это с ссылками на методы и функциональными интерфейсами работает на более низком уровне. Самый простой пример, где у нас есть список
List<String> list = new ArrayList<>();
list.add("b");
list.add("a");
list.add("c"):
Теперь мы хотим отсортировать его с помощью класса Collections, чтобы мы могли вызвать:
Collections.sort(list, String::compareToIgnoreCase);
Но если мы определим пользовательский компаратор, это может быть что-то вроде:
Comparator<String> customComp = new MyCustomOrderComparator<>();
Collections.sort(list, customComp::compare);
Проблема в том, что Collections.sort принимает два параметра: список и компаратор. Поскольку Comparator является функциональным интерфейсом, его можно заменить на лямбда-выражение или ссылку на метод с той же сигнатурой (параметры и тип возвращаемого значения). Итак, как это работает, что мы можем также передать ссылку на CompareTo, которая принимает только один параметр, а сигнатуры этих методов не совпадают? Как ссылки на методы переводятся в Java8?