我正在做一些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。
答案 0 :(得分:6)
如果将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
变量之前将其转换为某个函数接口类型。
答案 1 :(得分:0)
因为Java编译器使用属性类型来识别lambda表示的匿名类的字段。 根据{{3}},lambda只是一种方便的方法,用一个单独的方法表示匿名类,并创建类的对象。 Object类有更多的方法,它是一个类。 Lambda与接口一起使用。