Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Kotlin和Java类的Lambda表达式表现不同?_Kotlin - Fatal编程技术网

为什么Kotlin和Java类的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

为什么我可以将Lambda用于类
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() {}
    })