你絕對想不通的kotlin,當使用lambda實現函式式介面時爬的“巨坑”
阿新 • • 發佈:2019-01-07
實現函式式的介面
- 在學習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寫“函式式介面”,否則就是你的錯