为什么我不能将lambda分配给Object?

时间:2014-11-09 12:38:10

标签: java java-8

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

Object f = ()->{};

它给我错误的说法:

 The target type of this expression must be a functional interface

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

2 个答案:

答案 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表达式之间存在一些差异,但您可以查看它们,因为它们只是使用单个抽象方法实例化类型对象的语法糖。