java—此表达式的目标类型必须是函数接口:function vs consumer

xwbd5t1u  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(246)

在代码1中:没有错误,它可以工作。代码2有上述编译时错误。
问题1:为什么?
问题2:如何在代码2中返回函数?
代码1:

static <T> Consumer<T> m1(Consumer<T> consumer) {
    Consumer<T> c = obj -> {
        consumer.accept(obj);

    };
    return c;
}

代码2:

static <T, R> Function<T, R> m2(Function<T, R> f) {
    // Compile Error: The target type of this expression must be a functional interface
    Function<T, R> o = {x -> {
        f.apply(x);
    }};
    return o;

}
b09cbbtk

b09cbbtk1#

在代码2中,我得到了eclipse中的错误,这是没有帮助的。在命令行上编译时,出现以下错误:

J.java:28: error: illegal initializer for Function<T,R>
                Function<T, R> o = {x -> {
                                   ^
  where T,R are type-variables:
    T extends Object declared in method <T,R>m2(Function<T,R>)
    R extends Object declared in method <T,R>m2(Function<T,R>)
J.java:28: error: lambda expression not expected here
                Function<T, R> o = {x -> {
                                    ^
2 errors

你的牙套没必要。外对大括号正在尝试创建数组初始值设定项,而不是lambda表达式。内大括号确实尝试创建lambda表达式,但这不能在数组初始值设定项中完成。
可以使表达式成为lambda表达式的返回类型,而不使用大括号。尝试:

Function<T, R> o = x -> f.apply(x);

相关问题