为什么我不能将lambda赋给Object?

我试图将lambda分配给Object类型:

Object f = ()->{}; 

它给我错误说:

  The target type of this expression must be a functional interface 

为什么会这样,以及如何做到这一点?

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

 Runnable r = () -> {}; 

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

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

编译器只能将lambda表达式转换为声明了单个抽象方法的类型。 这就是它所谓的“function界面”。 而Object显然不适合这种情况。

如果你这样做:

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

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

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

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

由于f的类型签名,Java可以推断lamba表达式必须是Runnable类型。 但是,Java世界中没有“lambda类型”。

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

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