Tro*_*yvs 0 java lambda types interface function
我正在测试java的lambda是否与接口函数匹配,我在下面编写了代码,它可以工作。我有界面MyHandler,及其myFunction。在构造时,Java lambda 被转换为我的接口的实现者。
package mygroup;
interface MyHandler{
void myFunction(int i);
}
class Worker{
private final MyHandler handler;
public Worker(MyHandler h){
handler = h;
}
public void work(int i){handler.myFunction(i);};
}
public class TestLambda {
public static void main(String[] args) {
Worker worker = new Worker(i -> System.out.println(i));
worker.work(3);
}
}
Run Code Online (Sandbox Code Playgroud)
程序将打印3. 到目前为止一切顺利,但如果我添加一些其他函数声明,MyHandler如下所示:
interface MyHandler{
void myFunction(int i);
void f(int i, int j);
}
Run Code Online (Sandbox Code Playgroud)
Thread 构造函数中的 lambda 将无法编译,表示
The constructor Worker((<no type> i) -> {}) is undefinedJava(134217858)
The target type of this expression must be a functional interfaceJava(553648781)
Run Code Online (Sandbox Code Playgroud)
MyHandler那么,无论我的函数名称是什么,Java 编译器什么时候才能决定 lambda 可以匹配 的类型?接口定义中只有 1 个且只有 1 个函数?
Lambda 是“函数式接口”的实现。函数式接口是一种只有一个抽象方法的接口。方法的名称并不重要。只有一种方法的原始接口满足该条件。具有两个不同抽象方法的第二个版本不满足条件,并且编译器拒绝使用 lambda 作为 MyHandler 的实现。
请注意,如果您想要在接口方面进行非常有用的编译器检查,您可以添加可选的 @FunctionalInterface 注释。编译器将验证确切的一个抽象方法条件:
@FunctionalInterface
interface MyHandler{
void myFunction(int i);
}
Run Code Online (Sandbox Code Playgroud)
有了这个注解,如果抽象方法数量不等于1,就会编译失败。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |