Comparator.reverseOrder()
- это выражение, которое разрешается в тип Comparator
, потому что это то, что оно возвращает.
Comparator::reverseOrder
- это выражение, которое разрешается в метод , который не принимаетаргументы и возвращает Comparator
например, Supplier<Comparator<String>>
, хотя это может быть любой соответствующий функциональный интерфейс.
Во втором случае вы пытаетесь передать метод (который предоставляет Comparator
) в качестве аргумента,Метод не хочет этого - он просто хочет сам Comparator
.
Вы можете думать об этом так (просто псевдокод, чтобы продемонстрировать смысл):
s.sorted(new Comparator())
vs
s.sorted(new Supplier(new Comparator()))
Чтобы ответить на ваш второй вопрос о том, возможно ли когда-либо использовать ссылку на метод для статического метода интерфейса - да, абсолютно!
Если мы объявимследующий метод:
<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
тогда мы определенно можем вызвать его со ссылкой на метод
giveMeAComparatorSupplier(Comparator::reverseOrder);
(И, к вашему сведению, ваш синтаксис ссылки на метод неверен - он никогда не использует ()
)