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

Ami*_*era -1 java lambda java-8 functional-interface

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

    Consumer consumer = (o1) -> {};
    Object obj1 = consumer; // this two line working fine 
Run Code Online (Sandbox Code Playgroud)

2行以上的代码时,我分配预期不抱怨任何事情consumerobj1.

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

    Object obj2 = (o1) -> {}; // this line gives compilation error
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:我已经编辑了我的问题,因为有一个类似的问题已经提到但我的问题主要目标是确保为什么Object o1 = "Hello"会工作但不是lambda.

Era*_*ran 6

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

例如,lambda表达式o -> o.toString ()可以分配给a Consumer或a Function:

Consumer<String> cons = o -> o.toString ();
Function<String,String> cons2 = o -> o.toString ();
Run Code Online (Sandbox Code Playgroud)

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