1. 程式人生 > >你絕對想不通的kotlin,當使用lambda實現函式式介面時爬的“巨坑”

你絕對想不通的kotlin,當使用lambda實現函式式介面時爬的“巨坑”

實現函式式的介面

  • 在學習kotlin的時候,我一直搞不懂為什麼kotlin定義的“函式式介面”為什麼不能用像官方文件用lambda表示式。

像如下的方式,使用kotlin定義一個“函式式介面(只有單個抽象方法的介面)”

interface Intest{
    open fun foo()
}

接下來我們使用官網的lambda實現方式

fun main(args: Array<String>) {
    var intest = Intest{
        println("this is my foo")
    }
}

很不幸,這裡編譯器會報錯: Interface Intest does not have constructors

遇到這樣的錯誤,我很是懵逼啊,為什麼!!!

其實是我理解官方文件理解錯誤了,或者是認為kotlin中也有函式式的介面。(kotlin有沒有函式式介面,我不知道,但是我肯定Java一定有)

我們回顧一下官方文件

  • 如果物件是函式式 Java 接⼝(即具有單個抽象⽅法的 Java 接⼝)的例項,你可以使⽤帶接⼝型別字首的lambda表示式建立它

看看,已經說了很明白,如果物件是java的函式式介面,才可以使用lambda方式實現

那麼久定義一個函式式Java介面試試:

public interface InterTest {
    void foo();
}

接下來我們來使用lambda表示式區實現它

fun main(args: Array<String>) {
    var intertest = InterTest { println("this is my foo") }
    intertest.foo()
}

這次很幸運,編譯器沒有報錯

  • 看來看仔細官方文件很重要,就比如說這裡,說是Java函式式介面就一定不能用kotlin寫“函式式介面”,否則就是你的錯