编程拼图&使用此代码编码高尔夫那里的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完全实现了接口。
答案 0 :(得分:3)
lambda表达式只能分配给功能接口。功能界面必须有一个抽象方法。
foo
是I
接口的单一抽象方法,因此在删除它之后,您无法将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无法实现它,因为它不存在。