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

Why we can't assign lambda expression directly to reference variable of type Object?

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

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

当我将 consumer 分配给 obj1 时,以上 2 行代码没有像预期的那样抱怨任何事情。

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

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

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

The target type of this expression must be a functional interface.

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

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

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

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

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

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

因为 Java 编译器使用 属性 类型来识别 lambda 表示的匿名 class 的字段。 根据 Oracle tutorials,lambda 只是一种方便的方法,可以用单独的方法表示匿名 classes 并创建 classes 的对象。对象class的方法比较多,是一个class。 Lambda 与接口一起使用。