Kotlin中的Lambda表达式

cdr*_*oid 27 java lambda kotlin

考虑以下Java类:

public class SomeClass {
    public interface Something {
        void doSomething();
    }

    public void call(Something something) {}
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,我可以使用lambda表达式,如下所示:

SomeClass().call { 
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但是如果我在Kotlin中定义以下方法(使用相同的接口):

fun call(something: Something) {}
Run Code Online (Sandbox Code Playgroud)

然后这个电话:

call {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

会产生类型不匹配错误.为什么?

And*_*lav 27

Kotlin仅支持Java方法的SAM转换,因为Kotlin本身具有函数类型.通常,Kotlin的功能应该是() -> Unit而不是Something.如果你真的需要它Something,你可以使用SAM构造函数:

call(Something { /* do something */ })
Run Code Online (Sandbox Code Playgroud)

任何SAM类型(带有一个抽象方法的Java接口)都会自动获得将lambda转换为其实例的构造函数.

  • 这个决定对我来说很奇怪.考虑`List <(T) - > Unit>`vs`List <OnChangeListener <T >>`.第二个载有更多信息.幸运的是有一个解决方法:我们可以在kotlin项目中自由使用java代码. (4认同)
  • 命名的函数类型是一个不同的故事.它们将在下一版Kotlin中得到支持 (3认同)

Jak*_*yer 10

Kotlin要求调用需要一些接口something.

() -> Kotlin.Unit
Run Code Online (Sandbox Code Playgroud)

不满足类型要求.

你可以这样做

call (object : Something {
    override fun doSomething() {
        println("Passing an interface to call in kotlin!")
    }
})
Run Code Online (Sandbox Code Playgroud)