2017-08-02 41 views
1
@FunctionalInterface 
interface MyLambda { 
    void apply1(); 
    int apply2(int x, int y); 
} 

現在使用Lambda表達式爲什麼不能爪哇允許低於2,因爲它清楚地在兩者之間區分:爲什麼Java8的Functional Interface中沒有多個抽象方法?

MyLambda ml1 =() -> System.out.println("Hello"); 
MyLambda ml2 = (x, y) -> x+y; 
+0

沒有技術上的原因,你爲什麼不能。但它不會是這樣。語法可能會很糟糕,可能會損害單一方法lambda。這也不是特別有用。您添加的方法越多,編寫適當的實施課程就越引人注目。 – Michael

+1

當你調用'ml1.apply2(x,y)'時會發生什麼? –

+0

謝謝大家的意見。我想我得到了答案,將發佈答案 – sairam

回答

0

功能接口是具有一個抽象 方法的接口(除了來自Object的方法),因此代表一個單一功能合約 。這種「單一」方法可以採取多種抽象方法的形式,具有從超級接口繼承的替代等效簽名 ;在這種情況下,繼承的方法 在邏輯上表示單個方法。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8

+1

這回答「什麼是功能接口」,但不是「爲什麼功能接口不能包含多個抽象方法」。 – Michael

+0

感謝您的回答,瞭解它是遵循單一功能合同,但爲什麼? – sairam

1

這是一個很有趣的問題。

答案是,要創建一個有效的實現,您需要能夠一次傳遞N個lambda表達式,這會引入很多模糊性和巨大的可讀性下降。

另一件事是@FunctionalInterface用於表示一個接口,它可以用作lambda表達式的目標,lambda是SINGLE函數。

無論如何,你的例子是無效的,不會編譯,因爲它試圖創建兩個實例,並且都不完整。

+0

感謝您的回答,僅僅是因爲可讀性的原因。我們有超載的概念,我們可以爲蘭姆達斯或抽象的方法是我想的! – sairam

+0

@sairam你在一個界面中放置的方法越多,如果可能的話,你會得到更多的模糊性 - 而且我們已經有了一個很好的工具 - 經典的界面實現:) –

+0

這很有道理。但請檢查我的答案爲什麼只有一種方法是必須的:)感謝您的幫助 – sairam

0

編寫Lamba表達式意味着我們正在實現的是功能接口的接口。它應該有一個抽象方法,因爲在lambda表達式時,我們只能一次提供一個實現。 因此,在問題中發佈的代碼片段中,我們隨時只給出一個實現,同時聲明Lambda,我們將不得不實現兩個抽象方法。

感謝您的幫助。

相關問題