代码之家  ›  专栏  ›  技术社区  ›  Amit Bera

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

  •  -1
  • Amit Bera  · 技术社区  · 7 年前

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

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

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

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

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

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

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

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

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

    2 回复  |  直到 7 年前
        1
  •  7
  •   Eran    7 年前

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

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

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

    因此,您必须将lambda表达式赋给函数接口类型的变量,或者在将lambda表达式赋给 对象 变量

        2
  •  0
  •   Alexander Belenov    7 年前

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