Понять объявление метода работы терминала

Обычно в объявлении метода указывается тип возвращаемого значения, полный путь к методу и параметры. Но когда я смотрю на метод java.util.stream.Stream.collect, я запутался.

Кажется, метод имеет два возвращаемых типа:

<List<Integer>, Object> List<Integer> java.util.stream.Stream.collect(Collector<? super Integer, Object, List<Integer>> collector)

Я понимаю, что его реальный возвращаемый тип — List<Integer>, но что означает <List<Integer>, Object>? Почему это один пробел перед List<Integer> и почему его ключ (если это карта?) такой же, как реальный тип возвращаемого значения?


person fall    schedule 12.09.2017    source источник
comment
Во-первых, это не возвращаемый тип, он указывает типы для параметров универсального типа R и A. Здесь может помочь чтение javadoc. Метод возвращает R, поэтому тип возвращаемого значения должен совпадать с параметром типа.   -  person Nathan Hughes    schedule 12.09.2017


Ответы (1)


Взгляните на объявление метода:

public interface Stream<T> extends BaseStream<T, Stream<T>> {
    ...
    /* ...
     * @param <R> the type of the result
     * @param <A> the intermediate accumulation type of the {@code Collector}
     * ...
     */
    <R, A> R collect(Collector<? super T, A, R> collector);
    ...
}

Как указал Натан в комментариях, <R, A> обозначает параметры универсального типа. Они будут выводиться компилятором Java, если они недвусмысленны. В вашем случае R было выведено из List<Integer>, а A из Object. Вы можете прочитать здесь об универсальных методах.

person Community    schedule 12.09.2017
comment
Чтение по этим ссылкам docs.oracle.com/javase/tutorial/java/ generics/methods.html, docs.oracle.com/ javase/tutorial/java/generics/ и docs.oracle .com/javase/tutorial/extra/generics/methods.html после ответа, теперь я понимаю. - person fall; 13.09.2017