在Kotlin中的Lambdaexpression式

考虑下面的Java类:

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

在Kotlin中,我可以使用lambdaexpression式,如下所示:

 SomeClass().call { // do something } 

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

 fun call(something: Something) {} 

然后这个电话:

 call { // do something } 

会产生一个types不匹配的错误。 为什么?

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

 call(Something { /* do something */ }) 

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

Kotlin要求调用需要一些接口。

 () -> Kotlin.Unit 

不满足types要求。

你可以这样做

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