Подскажите, какой тип возвращает функция

Не могу разобраться, какой тип возвращает следующая функция

public <D extends DataSource> DataSourceBuilder<D> type(Class<D> type) {
    this.type = type;
    return this;
}

Уточню свой вопрос. Пока я начинающий, я привык к такому виду функций

Модификатор_доступа Тип_возвращаемого_значения Название_функции(Параметры)

Например

public List<?> getListOfSomething()

Вернет List объектов, классы которых наследуются от Object


А в примере выше как будто возвращается двойной тип - примерно вот так я вижу

public Тип_Наследник_DataSource Тип_DataSourceBuilder имя_функции (Параметр)

Как это понять? Двойной тип же не может быть, видимо я неправильно читаю функцию?


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

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

Вкратце:

  • DataSourceBuilder<D> перед именем метода - это и есть тип возвращаемого значения метода.
  • <D extends DataSource> перед типом возвращаемого значения показывает, что тут generic (обобщенный) метод, в определении которого далее будет использоваться тип D расширяющий тип DataSource.

В дальнейшем при использовании метода, когда будет передан конкретный параметр, D будет замещен конкретным типом. Т.е., например, если метод будет вызван как type(SomeDataSource.class) (где SomeDataSource отнаследован от DataSource), то у возвращаемого значения будет тип DataSourceBuilder<SomeDataSource>.

Более простой (игрушечный) пример без ограничения типа:

private static <T> List<T> singleItemList(T item) {
    return List.of(item);
}

public static void main(String[] args) {
    List<Integer> list = singleItemList(1);
}

Тут <T>, опять же, говорит, что это обобщенный метод, и дальше в определении метода будет использоваться тип T (без ограничения, от чего он будет отнаследован).

Дальше при передаче в метод целого числа, итоговый возвращаемый тип станет List<Integer>, при передаче строки - List<String>, и т.д.

→ Ссылка