为什么我可以将Lambda用于课程java.lang.Thread
,但不能用于MyThread
?
interface MyRunnable{
fun run()
}
class MyThread(runnable : MyRunnable){
}
fun test(){
Thread({}) // All Alright
MyThread({}) //Exception. Type mismatch <<-- Why ?
}
检查此示例的链接:https://try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8
答案 0 :(得分:6)
来自SAM conversions上的文档:
请注意,此功能仅适用于Java互操作;由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持。
换句话说,只有对Java的调用才支持使用{ ... }
语法。公共理由是你可以做以下任何一种:
让您的MyThread
构造函数将第一类函数类型作为参数。
MyThread(object : MyRunnable {
override fun run() {}
})
这显然相当冗长。但是,根据this Kotlin票证,lambda语法实际上只是Java互操作的一部分,而不是核心语言的一部分,所以需要一些精心设计来做更多的事情。