有人可以向我解释一下,为什么编译器不会自动推断出此表达式类型吗?
Stream.empty().collect(Collectors.summingInt(CharSequence::length))
我们知道CharSequence::length
在这种情况下是ToIntFunction<CharSequence>
,因此从流元素使用的类型是CharSequence
,因此,正在收集的流的类型是{{ 1}}。
在我的IDE上,出现以下错误:
Stream类型的方法collect(Collector <?super Object,A,R>)不适用于参数(Collector
)
从错误消息中可以看到,Stream<CharSequence>
会自动推断为Stream.empty()
,这绝对不是我想要的!
答案 0 :(得分:3)
Java的Stream.empty()
是具有以下声明的通用方法。
public static<T> Stream<T> empty() {
// Remainder omitted.
}
因此,您必须显式传递类型参数。否则,它将创建类型为Stream
的{{1}}。因此,请像这样更改您的声明以消除错误。
java.lang.Object
Java不会根据Stream.<CharSequence>empty().collect(Collectors.summingInt(CharSequence::length));
处理管道中的下游操作中使用的数据类型来推断类型。类型解析算法没有您想象的那么聪明。但是,如果将值传递给工厂方法,它将进行推断。对于一个实例,它将起作用。
stream