繁体   English   中英

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

[英]How do lambda expressions that are java function literals work?

在《 Programming Puzzles&Code Golf》中,此代码存在以下元问题:

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完全实现该接口。

Lambda表达式只能分配给功能接口。 功能接口必须具有单个抽象方法。

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

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

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

Java 8中的Lambda表达式依赖于表示函数的接口。 这些称为“功能接口”。 通过使用单一的抽象方法即可识别它们。

如果它们不止一个,则Java无法确定lambda表达式给出的实现应该实现哪一个。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM