2017-06-02 49 views
2

看,我有一個Java類:爲什麼我不能使用lambda作爲kotlin的接口?

public final class JavaReceiveSingle { 
    public static void useSingle(Single single) { 
     single.doSth(); 
    } 
    public static void useSingle2(SingleInterface singleInterface) { 
     singleInterface.doSth(); 
    } 
} 

的Java接口:

public interface SingleInterface { 
    void doSth(); 
} 

一個科特林接口:

interface Single { 
    fun doSth() 
} 

現在我可以在科特林類像使用拉姆達:

JavaReceiveSingle.useSingle2({}) 

但是,如果我想要做同樣的事情科特林接口:

JavaReceiveSingle.useSingle({}) 

IDE會顯示錯誤:要求:單!發現:() - >單位

,如果我指定單,如:

JavaReceiveSingle.useSingle(Single{}) 

還是錯誤:接口單沒有結構!

雖然下面的代碼工作:

JavaReceiveSingle.useSingle(object :Single{ 
    override fun aa() {} 
}) 

但爲什麼我不能爲科特林接口使用拉姆達?

+0

Kotlin具有功能類型, G。 '() - > Unit'是一個不接受參數並返回Unit(無值)的函數。這樣,就不需要功能接口和SAM轉換。 –

+0

那麼在這種情況下,推薦使用函數類型來取代傳統的內部匿名類?如果是這樣,那麼我明白了 – user2699165

回答

1

目前,在Kotlin中定義的接口不支持SAM conversion。在YouTrack有一個問題,但目前我建議使用功能類型而不是單一方法的接口。如果你想讓他們有一個合適的名字,你可以使用type aliases,但不要過度使用它們。在許多情況下,功能類型和好的方法/變量名稱足以表達出來。

相關問題