Java lambda 如何自动匹配接口的函数?

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 个函数?

Jak*_*eee 5

Lambda 是“函数式接口”的实现。函数式接口是一种只有一个抽象方法的接口。方法的名称并不重要。只有一种方法的原始接口满足该条件。具有两个不同抽象方法的第二个版本不满足条件,并且编译器拒绝使用 lambda 作为 MyHandler 的实现。

请注意,如果您想要在接口方面进行非常有用的编译器检查,您可以添加可选的 @FunctionalInterface 注释。编译器将验证确切的一个抽象方法条件:

@FunctionalInterface
interface MyHandler{
    void myFunction(int i);
}
Run Code Online (Sandbox Code Playgroud)

有了这个注解,如果抽象方法数量不等于1,就会编译失败。