【问题标题】:Getting Error :: The target type of this expression must be a functional interface出现错误 :: 此表达式的目标类型必须是函数式接口
【发布时间】:2020-10-17 10:18:29
【问题描述】:

我正在尝试实现一个示例库,客户端可以使用该库执行他们的代码,为了实现它,我正在使用 JAVA 的函数式编程特性。 但是出现编译错误这个表达式的目标类型必须是函数式接口

@FunctionalInterface
public interface ImplemenetIt<T> {
    public T provideYourImpl();
}

public class HighOrderFunctionClass<T> {

    public T executeCode(ImplemenetIt<T> it, T defaultAnswer) {
        T answer = defaultAnswer;

        return () -> { // At this line I am getting error
            try {
                answer = it.provideYourImpl();
            } catch (Exception ex) {

            } finally {
                return answer;
            }
        };
    }
}

请提出我所缺少的。

【问题讨论】:

  • 你的 lambda 表达式的主体是完全有害的。您正在捕获所有Exceptions,然后默默地忽略它们(因为您的catch 块是空的)。无论如何,异常都会被吞下,因为您的finally 块中有一个return。你shouldn't do that.
  • 关于您遇到的错误:您将executeCode 的返回类型定义为T,但您正试图返回功能接口的一些实现。但是T可以是任意类型,所以lambda表达式不能符合T

标签: java lambda functional-programming


【解决方案1】:

lambda expression 是功能接口的实现。您的方法 executeCode() 返回一个泛型类型 (T),而 T 不是函数式接口,但方法 executeCode() 中的代码试图返回一个函数式接口。

方法 executeCode() 的参数之一也是函数式接口,因此当您调用该方法时,您可以将 lambda 表达式作为参数传递,即

executeCode( () -> return null, someDefault )

这是一个更“具体”的例子。

public class Tester {
    public static void main(String[] args) {
        HighOrderFunctionClass<String> hofc = new HighOrderFunctionClass<>();
        String someDefault = "I am the default value.";
        ImplemenetIt<String> it = () -> return "Hello world.";
        String result = hofc.executeCode(it, someDefault);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多