тип возврата generi c, когда использовать <T>returnType <T>и когда просто использовать returnType <T>? - PullRequest
0 голосов
/ 15 февраля 2020

В generi c api, почему иногда параметр типа записывается перед возвращаемым типом, а иногда нет необходимости?

Учитывая следующие два API Steam в качестве примера

Stream<T>   limit(long maxSize)

и

<R> Stream<R>   map(Function<? super T,? extends R> mapper)

Почему тип возвращаемого значения Stream.limit можно просто записать как Stream<T>, а не <T> Stream<T>?

Когда использовать <T> returnType <T> и когда использовать returnType<T> * * 1016

Ответы [ 3 ]

5 голосов
/ 15 февраля 2020

T в первом примере - это параметр generi c для Stream, над которым работает, поэтому limit(...) возвращает новый Stream того же типа generi c, как и поток, который вызывается limit(...) on.

Во втором примере тип generi c результирующего Stream может быть изменен, поэтому необходим отдельный параметр generi c. в этом случае на тип результирующей Stream влияет mapper -ламбда. Например, если Person s сопоставлены с SocialSecurityNumber, то начальный Stream будет Stream<Person>, mapper будет иметь тип Function<Person, SocialSecurityNumber>, а результирующий Stream будет Stream<SocialSecurityNumber>.

3 голосов
/ 15 февраля 2020

Первый <R> в <R> Stream<R> - это просто еще одна часть сигнатуры метода - параметры типа. Вы не должны рассматривать <R> Stream<R> как «одну» вещь, как вы, кажется, сделали в заголовке вашего вопроса.

Первый <R> просто для того, чтобы сказать вам, каковы параметры типа этого метода поэтому map - это обобщенный c метод. limit не является обобщенным c методом, потому что он не имеет этой части в своей подписи.

Вы можете быть озадачены тем, что limit не является обобщенным c методом, поскольку он явно возвращает то, что имеет обобщенный c параметр T. Что ж, T на самом деле является параметром c обобщающего класса Stream<T>, поэтому limit не может на самом деле возвращать любой другой тип, кроме Stream<T>, для которого он был вызван. Если вы позвоните limit по номеру Stream<A>, вы не сможете ожидать, что он даст вам Stream<B>. Следовательно, limit не является обобщенным c.

Обратите внимание, что T также используется список параметров map.

, когда использовать <T>returnType<T> и когда просто использовать returnType<T>?

Большая разница в том, что <T> returnType<T> делает метод обобщенным c. returnType<T> не является универсальным c методом и может использоваться только в том случае, если T на самом деле существует в контексте.

0 голосов
/ 15 февраля 2020

Существуют различные виды Generi c в java: Generi c Тип и Generi c Метод. В типе Generi c вы указываете тип для вашего класса или интерфейса, и этот параметр типа может использоваться в любом из ваших методов класса, а также в полях вашего класса или интерфейса.

Здесь метод limit существует в интерфейсе Stream<T>, поэтому он может использовать параметр типа из содержащего класса или интерфейса (как в возвращаемом типе метода, так и в параметре метода). Здесь limit использует T в своем типе возврата. Не путайте этот случай с тем, что limit возвращает Stream<T>. Он мог бы вернуть любой другой объект (например, Employee<T>).

С другой стороны, у нас есть методы Generi c, которые определяют параметры своего собственного типа и задают этот параметр перед возвращаемым типом, и этот параметр указать c для этих методов (а не другой метод, содержащий класс). Здесь карта находится в этой категории. Если вы видите определение интерфейса Stream<T>, то в параметрах типа этого класса нет R. Он задается c для отображения и используется только самой картой.

Вот заголовок интерфейса Stream<T>:

public interface Stream<T> extends BaseStream<T, Stream<T>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...