2016-10-19 47 views
2

我有兩個接口:爪哇8 LAMBDA:兩個接口與方法具有相同數目的參數

interface A { 
    public void pull(SomeclassA a, SomeclassB b); 
} 

interface B { 
    public void make(SomeClassM m, SomeclassN n); 
} 

在每interface我有相同數目的參數的方法。然後我與使用上述兩個接口方法均一類,即:

public class C { 

    public void test(B b) { 

    } 

    public void test(A a) { 

    } 

} 

我需要使用與Java 8 lambda表達式的類。 Java如何識別哪個接口傳入此類的方法?

public static void main(String[] args) { 
    C c = new C(); 
    c.test(
     (a , b) ->{ 

     } 
    ); 
} 
+0

其中一個方法被隱式選中,另一個應該更改爲內部類創建或嘗試轉換到適當的接口。但你絕對可以改變方法名稱,使它們是唯一的。 –

+0

這個調用是不明確的:[Ideone](http://ideone.com/NwrbzH) –

+0

@TimothyTruckle:是java 8 lambda表達式創建時不知道java中的重載方法.... 如果我創建的API有重載方法? –

回答

4

你會得到一個編譯錯誤,因爲編譯器不具有的兩個重載test方法之間做出選擇的方式。

要解決這個問題,您必須指定lambda參數的類型。

例如:

public static void main(String[] args) { 
    C c = new C(); 
    c.test(
     (SomeClassM a , SomeClassN b) -> { 

     } 
    ); 
} 

將導致test(B b)被選擇。

+0

如果我使用重載方法創建類(同名和數字參數,但類型不同),則不存在編譯錯誤。我認爲這是寫在Java 8規範... –

+2

@MohammadFajar我試過你的代碼,並得到一個編譯錯誤(我沒有使用不同的類名稱而不是SomeClassX)。 '方法測試(B)對類型C'不明確。 – Eran

+1

或者它可能是'c.test((A)(a,b) - > {});' – saka1029