为什么我无法将 lambda 分配给对象?

2022-09-03 04:36:19

我试图将lambda分配给对象类型:

Object f = ()->{};

它给了我错误说:

 The target type of this expression must be a functional interface

为什么会发生这种情况,如何做到这一点?


答案 1

这是不可能的。根据错误消息不是功能接口,这是一个具有单个公共方法的接口,因此您需要使用引用类型,例如Object

Runnable r = () -> {}; 

答案 2

发生这种情况是因为Java语言中没有“lambda类型”。

当编译器看到 lambda 表达式时,它将尝试将其转换为您尝试面向的功能接口类型的实例。这只是语法糖。

编译器只能将 lambda 表达式转换为声明了单个抽象方法的类型。这就是它所说的“功能接口”。显然不符合这个要求。Object

如果这样做:

Runnable f = (/*args*/) -> {/*body*/};

然后,Java将能够将lambda表达式转换为扩展的匿名类的实例。从本质上讲,它与写作是一回事:Runnable

Runnable f = new Runnable() {
    public void run(/*args*/) {
        /*body*/
    }
};

我已经添加了注释,只是为了使其更清晰,但不需要它们。/*args*//*body*/

Java 可以推断出 lamba 表达式必须是类型的,因为 的类型签名 。但是,Java世界中没有“lambda类型”。Runnablef

如果您尝试创建一个在 Java 中不执行任何操作的泛型函数,则无法创建。Java是100%静态类型和面向对象的。

匿名内部类和 lambdas 表达式之间存在一些差异,但您可以查看它们,因为它们只是使用单个抽象方法实例化类型对象的语法糖。


推荐