Первый <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
на самом деле существует в контексте.