Читаю Хорстмана Java 8 издание. В одной из глав используются статические методы интерфейса Comparator. До дженериков еще не дошел, но примерно понимаю что это. В этом интерфейсе есть метод comparing:
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
Не могу понять как он работает. Что значит возвращаемый методом тип:
<T, U extends Comparable<? super U>> Comparator<T>
и в операторе return, это приведение к типу, или еще что?
(Comparator<T> & Serializable)
Было бы хорошо, если кто-то мог объяснить построчно, что происходит в этом методе.
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(...)
Comparator<T> - возвращаемый параметризованный тип, где T - параметр заведомо неизвестного типа, но во время выполнения будет известен. Данный параметр объявлен в следующей записи: <T, U extends Comparable<? super U>>, поэтому далее в внутри метода можно использовать параметр типа T.<T, U extends Comparable<? super U>> - объявляет два типовых параметра: первый - T, второй - U. Параметр типа U может быть любым типом, наследующим Comparable. Comparable в свою очередь может быть параметризован любым типом, который не выходит за границы U. Получается параметр U может быть любым типом между Comparable и U.но во время выполнения будет известен.
во время выполнения ничего не известно так как в Java стираются типы. И ещё, опять таки из за этого можно не заморачиваться с типами. Метод .compareTo выполнится в зависимости от того какой в действительности это обьект с его создания, а не от того какой у него сейчас каст.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости