Отдельно стоящий параметр типа в Java Generics - PullRequest
3 голосов
/ 11 октября 2019

Раздел параметров типа универсальных типов Java следует за именем универсального класса. Например:

class name<T1, T2, ..., Tn> { /* ... */ }

Это довольно интуитивно понятно, когда вы освоите его. Однако я совершенно ошеломлен, увидев некоторые автономные разделы параметров типа в интерфейсных методах по умолчанию Comparator<T>. Например:

default <U> Comparator<T> thenComparing(
        Function<? super T, ? extends U> keyExtractor,
        Comparator<? super U> keyComparator)

Очевидно, что метод возвращает какой-то объект-компаратор, но как вы объясните автономную <U> в английских терминах?

1 Ответ

5 голосов
/ 11 октября 2019

Он вводит сам параметр типа. Если бы вы написали сигнатуру метода без нее:

Comparator<T> thenComparing(
        Function<? super T, ? extends U> keyExtractor,
        Comparator<? super U> keyComparator)

, это означало бы, что должен существовать какой-то конкретный тип с именем U, видимый для метода.

...