java 8收集器<;字符串,A,R>;不是一个功能界面,谁能说出原因?

java 8收集器<;字符串,A,R>;不是一个功能界面,谁能说出原因?,java,lambda,java-8,java-stream,collectors,Java,Lambda,Java 8,Java Stream,Collectors,代码如下: public class Test { public static void main(String[] args) { Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors::toList); } } 告诉我: 收集器不是功能接口 但当我修改代码如下,一切都是好的,我不知道为什么 public class Test { public static void main(Strin

代码如下:

public class Test {
    public static void main(String[] args) {
        Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors::toList);
    }
}
告诉我:

收集器
不是功能接口

但当我修改代码如下,一切都是好的,我不知道为什么

public class Test {
    public static void main(String[] args) {
        Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors.<String>toList());
    }
}
公共类测试{
公共静态void main(字符串[]args){
Stream.of(1,2,3).map(String::valueOf).collect(Collectors.toList());
}
}

收集器接口有多种方法(
合并器()
完成器()
供应商()
收集器()
)需要实现,因此它不能是功能接口,只能有一种方法,没有默认实现


我看不出你的问题与附加的代码有什么关系。

第一个语法非法的原因是方法签名所隐含的目标类型-
Stream.collect(Collector)
-是一个
收集器
Collector
有多个抽象方法,因此它不是一个功能接口,不能有
@FunctionInterface
注释

Class::function
object::Method
这样的方法引用只能分配给函数接口类型。由于
Collector
不是功能接口,因此不能使用任何方法引用向
collect(Collector)
提供参数


相反,作为函数调用
Collectors.toList()
。显式的
类型参数是不必要的,如果最后没有括号,您的“工作”示例将无法工作。这将创建一个
Collector
实例,该实例可以传递给
collect()

我想他们打算使用
Collector.toList()