Что означает T и U после модификаторов доступа, но до Function?

Что означает T и U после модификаторов доступа, но до Function?

static <T, U> Function<T, U> ternaryOperator

Ответы (1 шт):

Автор решения: insolor

Это кусок определения generic-метода, т.е. метода, где конкретные классы, с которыми он работает, определяются в зависимости от классов переданных в него значений.

Допустим, есть какой-то метод, который принимает список значений и функцию, которая должна примениться к каждому значению, определение будет примерно такое:

public static <T, U> List<U> map(List<T> list, Function<T, U> function) {
    return list.stream().map(function).collect(Collectors.toList());
}

<T, U> тут просто обозначают, что в дальнейшем определении метода T, U это не названия каких-то классов, а шаблонные имена, вместо которых при вызове метода подставятся конкретные классы.

Ну и соответственно дальше эти "буквы" показывают, какие ограничения накладываются на принимаемые и возвращаемые значения.

Например, если первым параметром передать список целых (List<Integer>), то значит вторым параметром должна приниматься функция, принимающая целое число как параметр (вместо T будет конкретный класс Integer). Если передать функцию, которая принимает целое, а возвращает строку (Function<Integer, String>), значит возвращаться должен список строк (вместо U будет String).

→ Ссылка