为什么在没有泛型的流列表上使用 collect 后会返回一个对象?

Pit*_*elk 4 java generics stream

为什么下面的代码产生一个对象而不是一个列表?

Object listWithoutGeneric = new ArrayList().stream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

(尝试替换 Object listWithoutGeneric = ... with List listWithoutGeneric = ... 产生编译错误)

而以下示例返回一个列表?

List listWithDefaultGeneric = new ArrayList<>().stream()
                                    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

您的终端操作 - collect- 具有以下签名:

<R, A> R collect(Collector<? super T, A, R> collector)
Run Code Online (Sandbox Code Playgroud)

即它返回一个类型的实例R

toList() Collector返回Collector<T, ?, List<T>>,所以R在这种情况下是一个List<T>

但是,如果您Stream从 raw创建 a ,那么ArrayListtheStream也是 raw ,所以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.