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)
您的终端操作 - 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.