为什么我们不能将lambda表达式直接赋给Object类型的引用变量?

时间:2018-04-12 12:15:20

标签: java lambda java-8 functional-interface

我正在做一些lambda表达式的实验,看到了一些我无法理解的行为。

    Consumer consumer = (o1) -> {};
    Object obj1 = consumer; // this two line working fine 

当我将consumer分配给obj1时,超过2行代码不会按预期投诉任何内容。

然而,当我尝试将lambda直接分配给对象时,它开始给我一个编译错误。

    Object obj2 = (o1) -> {}; // this line gives compilation error

上面一行代码给出了一个错误:

  

此表达式的目标类型必须是功能接口。

我的问题是为什么我们不能直接将lambda分配给Object类型的引用变量?

编辑:我已经编辑了我的问题,因为已经提到过类似的问题,但我的问题主要目标是确保Object o1 = "Hello"为什么会起作用而不是lambda。

2 个答案:

答案 0 :(得分:6)

如果将lambda表达式赋给类型为Object的变量,则编译器不知道此lambda表达式应该实现哪个函数接口。

例如,lambda表达式o -> o.toString ()可以分配给ConsumerFunction

Consumer<String> cons = o -> o.toString ();
Function<String,String> cons2 = o -> o.toString ();

因此,您必须将lambda表达式分配给函数接口类型的变量,或者在将lambda表达式赋值给Object变量之前将其转换为某个函数接口类型。

答案 1 :(得分:0)

因为Java编译器使用属性类型来识别lambda表示的匿名类的字段。 根据{{​​3}},lambda只是一种方便的方法,用一个单独的方法表示匿名类,并创建类的对象。 Object类有更多的方法,它是一个类。 Lambda与接口一起使用。