我试图将lambda分配给Object类型:
Object f = ()->{};
它给我错误的说法:
The target type of this expression must be a functional interface
为什么会发生这种情况,以及如何做到这一点?
答案 0 :(得分:19)
这是不可能的。根据错误消息Object
不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如
Runnable r = () -> {};
答案 1 :(得分:15)
这是因为没有" lambda类型"用Java语言编写。
当编译器看到lambda表达式时,它会尝试将其转换为您尝试定位的功能接口类型的实例。它只是语法糖。
编译器只能将lambda表达式转换为声明了单个抽象方法的类型。这就是它所谓的"功能界面"。并且Object
显然不符合这一点。
如果你这样做:
Runnable f = (/*args*/) -> {/*body*/};
然后,Java将能够将lambda表达式转换为扩展Runnable
的匿名类的实例。从本质上讲,它与写作相同:
Runnable f = new Runnable() {
public void run(/*args*/) {
/*body*/
}
};
我已添加评论/*args*/
和/*body*/
只是为了让它更清晰,但不需要它们。
由于Runnable
的类型签名,Java可以推断lamba表达式必须是f
类型。但是,没有" lambda类型"在Java世界。
如果您正在尝试创建一个在Java中不执行任何操作的通用函数,则无法实现。 Java是100%静态类型和面向对象的。
匿名内部类和lambdas表达式之间存在一些差异,但您可以查看它们,因为它们只是使用单个抽象方法实例化类型对象的语法糖。