为什么我们不能将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 ()
可以分配给 Consumer
或 Function
:
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 与接口一起使用。
我正在用 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 ()
可以分配给 Consumer
或 Function
:
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 与接口一起使用。