[英]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.