Java类型推断混乱

时间:2018-10-10 22:39:06

标签: java-8 java-stream type-inference collectors functional-interface

有人可以向我解释一下,为什么编译器不会自动推断出此表达式类型吗?

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(),这绝对不是我想要的!

1 个答案:

答案 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