2017-06-02 32 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 - 已经完成了:)(尽管如此,如果你打算编辑答案,请这样做,所以结果仍然有意义印刷!) –