为什么Kotlin和Java类的Lambda表达式表现不同?
为什么我可以将Lambda用于类为什么Kotlin和Java类的Lambda表达式表现不同?,kotlin,Kotlin,为什么我可以将Lambda用于类java.lang.Thread,而不能用于MyThread interface MyRunnable{ fun run() } class MyThread(runnable : MyRunnable){ } fun test(){ Thread({}) // All Alright MyThread({}) //Exception. Type mismatch <<-- Why ? } 接口MyR
java.lang.Thread
,而不能用于MyThread
interface MyRunnable{
fun run()
}
class MyThread(runnable : MyRunnable){
}
fun test(){
Thread({}) // All Alright
MyThread({}) //Exception. Type mismatch <<-- Why ?
}
接口MyRunnable{
趣味跑()
}
类MyThread(runnable:MyRunnable){
}
趣味测试(){
线程({})//一切正常
MyThread({})//异常。以下位置的文档中的类型不匹配:
请注意,此功能仅适用于Java互操作;由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持
换句话说,只有对Java的调用才支持使用{…}
语法
让您的MyThread
构造函数将一级函数类型作为参数
使用一个:
这显然是相当冗长的。但是,根据Kotlin ticket,lambda语法实际上只是Java interop的一部分,而不是核心语言的一部分,因此需要进行一些仔细的设计才能完成更多的工作。MyRunnable
可能是一个函数类型,也可能是一个类型别名,从而完全避免了这个问题。另请参阅.@Oliver如果你想做你提到的+1,请看@jayson-已经做了:)(不过,如果你要编辑答案,请这样做,这样结果在排版上仍然有意义!)当然,尾随*浪费字节!与:相同:
MyThread(object : MyRunnable {
override fun run() {}
})