Операция вашего терминала - 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
.