为什么Lambda表达式对Kotlin和Java类的行为有所不同?

Ego*_*kin 2 kotlin

为什么我可以在课堂上使用Lambda java.lang.Thread,但不能用于MyThread

interface MyRunnable{
    fun run()
}

class MyThread(runnable : MyRunnable){    
}

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

    MyThread({})   //Exception. Type mismatch <<-- Why ?
}
Run Code Online (Sandbox Code Playgroud)

链接检查此示例:https://try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8

Oli*_*rth 6

SAM转换的文档:

请注意,此功能仅适用于Java互操作; 由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持.

换句话说,{ ... }只有对Java的调用才支持使用语法.公共理由是你可以做以下任何一种:

  1. MyThread构造函数将第一类函数类型作为参数.

  2. 使用对象表达式:

    MyThread(object : MyRunnable {
        override fun run() {}
    })
    
    Run Code Online (Sandbox Code Playgroud)

这显然相当冗长.但是,根据这个 Kotlin票证,lambda语法实际上只是Java互操作的一部分,而不是核心语言的一部分,所以需要一些精心设计来做更多的事情.