作为java函数文字的lambda表达式如何工作?

时间:2015-02-04 20:43:44

标签: java lambda

编程拼图&使用此代码编码高尔夫那里的this元问题:

interface I {
  public static void main(String[] args) {
    System.out.println("Hello");
  }
    String foo(String s);
  }
class C {
  I i = s -> s.substring(1);
}

这是一个可运行的程序。我一直在使用ideone中的代码,并且能够创建各种错误,但这对我来说是最离奇的。

如果您使用s.substring(1)之类的内容替换5,则会收到此错误:

Main.java:16: error: incompatible types: bad return type in lambda expression
I i = s -> 5;//s.substring(1);
           ^
int cannot be converted to String

为什么?毕竟,我没有看到lambda完全实现了接口。

2 个答案:

答案 0 :(得分:3)

lambda表达式只能分配给功能接口。功能界面必须有一个抽象方法。

fooI接口的单一抽象方法,因此在删除它之后,您无法将lambda表达式分配给I类型的变量。

此外,foo具有与lambda表达式s -> s.substring(1)匹配的签名和返回类型 - 单个String参数和String返回类型。

至于你的编辑 - I i = s -> 5;是错误的,因为lambda表达式必须实现I接口,所以它不能返回int,因为foo I的方法会返回String

答案 1 :(得分:0)

Java 8中的Lambda表达式依赖于代表函数的接口。这些被称为“功能接口”。它们通过一种抽象方法得到认可。

如果它们有多个,那么Java无法判断lambda表达式给出的实现是哪个应该是imlement。

当然,如果没有 - Java无法实现它,因为它不存在。