簡體   English   中英

Java lambda 如何自動匹配接口的函數?

[英]How does Java lambda automatically match to an interface's 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);
    }
}

程序將打印3 到目前為止一切順利,但如果我在MyHandler中添加一些其他函數聲明,如下所示:

interface MyHandler{
    void myFunction(int i);
    void f(int i, int j);
}

Thread 構造函數中的那個 lambda 將無法編譯,說

The constructor Worker((<no type> i) -> {}) is undefinedJava(134217858)
The target type of this expression must be a functional interfaceJava(553648781)

那么,無論我的函數名稱是什么,Java 編譯器何時可以決定 lambda 可以匹配MyHandler的類型? 接口定義中只有 1 個且只有 1 個函數?

Lambda 是“功能接口”的實現。 函數式接口是一個只有一個抽象方法的接口。 方法的名稱無關緊要。 您只有一種方法的原始界面滿足該條件。 您的具有兩個不同抽象方法的第二個版本不滿足條件,並且編譯器拒絕使用 lambda 作為 MyHandler 的實現。

請注意,如果您想在接口一側進行非常有用的編譯器檢查,可以添加可選的@FunctionalInterface 注釋。 編譯器將驗證確切的一個抽象方法條件:

@FunctionalInterface
interface MyHandler{
    void myFunction(int i);
}

使用此注解,如果抽象方法的數量不等於 1,它將無法編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM