Почему после использования коллекции в пропаренном списке без generi c возвращает объект? - PullRequest
4 голосов
/ 15 января 2020

Почему следующий код создает объект вместо списка?

Object listWithoutGeneric = new ArrayList().stream().collect(Collectors.toList());

(пытается заменить Объект listWithoutGeneri c = ... на Список listWithoutGeneri c = ... выдает ошибку компиляции)

, а следующий пример возвращает список?

List listWithDefaultGeneric = new ArrayList<>().stream()
                                    .collect(Collectors.toList());

1 Ответ

6 голосов
/ 15 января 2020

Операция вашего терминала - collect - имеет следующую подпись:

<R, A> R collect(Collector<? super T, A, R> collector)

, т.е. она возвращает экземпляр типа R.

Возвращается toList() Collector Collector<T, ?, List<T>>, поэтому R в этом случае является List<T>.

Однако, если вы создаете Stream из необработанного ArrayList, Stream также является необработанным, поэтому R становится Object.

Другими словами, <R, A> R collect(Collector<? super T, A, R> collector) становится Object collect(Collector collector), поэтому collect возвращает Object.

Следовательно new ArrayList().stream().collect(Collectors.toList()) возвращает Object.

...