Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们可以';是否将lambda表达式直接赋给Object类型的引用变量?_Java_Lambda_Java 8_Functional Interface - Fatal编程技术网

Java 为什么我们可以';是否将lambda表达式直接赋给Object类型的引用变量?

Java 为什么我们可以';是否将lambda表达式直接赋给Object类型的引用变量?,java,lambda,java-8,functional-interface,Java,Lambda,Java 8,Functional Interface,我正在用lambda表达式做一些实验,看到了一些我无法理解的行为 Consumer consumer = (o1) -> {}; Object obj1 = consumer; // this two line working fine 当我将consumer分配给obj1时,上述两行代码不会像预期的那样抱怨任何事情 然而,当我试图直接将lambda分配给对象时,它开始给我一个编译错误 Object obj2 = (o1) -> {}; // this l

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

    Consumer consumer = (o1) -> {};
    Object obj1 = consumer; // this two line working fine 
当我将
consumer
分配给
obj1
时,上述两行代码不会像预期的那样抱怨任何事情

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

    Object obj2 = (o1) -> {}; // this line gives compilation error
上面的代码行给了我一个错误:

此表达式的目标类型必须是函数接口

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


编辑:我已经编辑了我的问题,因为前面已经提到了一个类似的问题,但我的问题的主要目的是确保为什么
Object o1=“Hello”
可以工作,但lambda不能工作。

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

例如,可以将lambda表达式
o->o.toString()
分配给
消费者
函数

Consumer<String> cons = o -> o.toString ();
Function<String,String> cons2 = o -> o.toString ();
消费者cons=o->o.toString(); 函数cons2=o->o.toString();
因此,在将lambda表达式分配给
对象
变量之前,您必须将lambda表达式分配给函数接口类型的变量,或者将lambda表达式强制转换为某个函数接口类型。

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

谢谢,现在清楚了。@VinayPrajapati谢谢!!!然而,我想知道Object o1=“Hello”是如何工作的,但是lambda表达式可以以同样的方式工作,但现在已经很清楚了。我建议删除这个问题@Amit!这里提到的重复问题对我来说不太清楚,比如if Object o1=“Hello”;在java中工作为什么不使用lambda呢?我想您正在使用?如果是这样的话,请注意您使用的是@Turing85,您是对的,谢谢您的建议。这只是为了测试代码,这就是为什么我没有使用泛型类型。