[英]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表达式只能分配给功能接口。 功能接口必须具有单个抽象方法。
foo
是I
接口的单个抽象方法,因此,在删除它之后,您无法将lambda表达式分配给类型I
的变量。
另外, foo
具有与lambda表达式s -> s.substring(1)
匹配的签名和返回类型-一个String
参数和一个String
返回类型。
至于你的编辑- I i = s -> 5;
这是错误的,因为lambda表达式必须实现I
接口,所以它不能返回int
,因为I
的foo
方法返回String
。
Java 8中的Lambda表达式依赖于表示函数的接口。 这些称为“功能接口”。 通过使用单一的抽象方法即可识别它们。
如果它们不止一个,则Java无法确定lambda表达式给出的实现应该实现哪一个。
当然,如果没有,则Java无法实现它,因为它不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.