2017-06-02 34 views
2

爲什麼我可以使用Lambda作爲java.lang.Thread類,但不能用於MyThread爲什麼Lambda表達式對於Kotlin和Java類表現不同?

interface MyRunnable{ 
    fun run() 
} 

class MyThread(runnable : MyRunnable){  
} 

fun test(){ 
    Thread({})  // All Alright 

    MyThread({}) //Exception. Type mismatch <<-- Why ? 
} 

鏈接來檢查這個例子:在SAM conversionshttps://try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8

+0

相同:https://stackoverflow.com/questions/44190468 –

+0

相同:https://stackoverflow.com/questions/44189319 –

回答

4

從文檔:

注意,此功能僅適用於Java的互操作;由於Kotlin具有適當的函數類型,所以函數自動轉換爲Kotlin接口的實現是不必要的,因此不受支持。

換句話說,使用{ ... }語法僅支持對Java的調用。公共理由是,你可以做任何的:

  1. 有你MyThread構造帶一流功能類型作爲參數。

  2. 使用object expression

    MyThread(object : MyRunnable { 
        override fun run() {} 
    }) 
    

這顯然是相當冗長。但是,根據Kotlin票據this,lambda語法實際上只是Java interop的一部分,而不是核心語言的一部分,所以需要一些謹慎的設計來做更多的事情。

+0

'MyRunnable'應該可能是一個功能類型+也許是一個類型別名,避免這個一起發佈。另見https://stackoverflow.com/questions/44323826/why-i-cant-use-lambda-for-interface-at-kotlin/。 –

+0

@Oliver如果你想做你提到的+1,請參閱https://youtrack.jetbrains.com/issue/KT-7770 –

+0

@ jayson - 已經完成了:)(儘管如此,如果你打算編輯答案,請這樣做,所以結果仍然有意義印刷!) –