我正在測驗看 java 的 lambda 是否會匹配介面函式,我在下面寫了代碼,它可以作業。我有 interfaceMyHandler和它的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)
MyHandler那么,無論我的函式名稱是什么,Java 編譯器何時可以確定 lambda 可以匹配 的型別?介面定義中只有 1 個且只有 1 個函式?
uj5u.com熱心網友回復:
Lambda 是“功能介面”的實作。函式式介面是一個只有一個抽象方法的介面。方法的名稱無關緊要。您只有一種方法的原始界面滿足該條件。您的具有兩個不同抽象方法的第二個版本不滿足條件,并且編譯器拒絕使用 lambda 作為 MyHandler 的實作。
請注意,如果您想在介面一側進行非常有用的編譯器檢查,可以添加可選的@FunctionalInterface 注釋。編譯器將驗證確切的一個抽象方法條件:
@FunctionalInterface
interface MyHandler{
void myFunction(int i);
}
使用此注解,如果抽象方法的數量不等于 1,它將無法編譯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494243.html
