簡體   English   中英

當我們在一個接口中添加兩個抽象方法並只實現一個方法時,為什么我們不能使用 lambda 實現另一個方法?

[英]When we add two abstract methods in an interface and implement just one method then why can't we implement the other method using lambda?

我正在練習 lambda 函數,我知道要使用它們,我們需要創建一個函數接口,它只包含一個未實現的抽象方法。

所以我想知道為什么 java 不允許多個抽象方法,即使它們具有不同的簽名。 所以我通讀了有關 Stack Overflow 的相關問題。 這就是我得到的。 類似的問題

答案是,為了創建一個有效的實現,您需要能夠一次傳遞 N 個 lambda,這會引入很多歧義並大大降低可讀性。

現在我做了一個小實驗,我創建了一個接口,其中包含兩個具有不同簽名的已實現抽象方法。

這是myInterface接口

interface MyInterface {
    abstract void func();
    abstract void func(int i);
}

並像我們通常做的那樣實現了一個 function 和另一個 lambda 表達式

這是Lambda class

class Lambda implements MyInterface{

    public void doWork(MyInterface myInterface) {
        myInterface.func();
    }
    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork( e -> System.out.println("func:" + e ));
    }

    @Override
    public void func() {
        System.out.println("func");
    }
    
}

顯然這段代碼不起作用。 我只是無法理解,即使我有兩個不同的簽名,即使其中一個被正常實現,那么為什么我們不能用 lambda 實現另一個剩余的方法。 它與代碼質量和可維護性有關嗎? 誰能解釋我無法理解它? 如果可能的話,請舉個例子。

您可以創建MyInterface的子接口,其中所有方法都使用default關鍵字實現,但只有一種方法。 如果他們不提供自己的實現,它允許您提供接口實現者“繼承”的默認實現。 因此,具有默認實現的方法不再是抽象的。 如果您在 s 子接口中有效地默認實現除一個接口之外的所有接口,您最終會得到一個功能接口(單個抽象方法接口)。 這允許您使用 lambda 表達式。

interface PartialInterface extends MyInterface {
    @Override
    default void func() {
        System.out.println("func");
    }
}
class Lambda {
    public void doWork(PartialInterface myInterface) {
        // both methods from the interface can be used
        myInterface.func();    // the default implementation "inherited" from PartialInterface
        myInterface.func(42);  // the single abstract method (inherited by PartialInterface from myInterface) overridden by the lambda expression
    }

    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork(e -> System.out.println("func:" + e));
    }
}

暫無
暫無

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

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