在Kotlin中的Lambda表达式
考虑下面的Java类:
public class SomeClass { public interface Something { void doSomething(); } public void call(Something something) {} }
在Kotlin中,我可以使用lambda表达式,如下所示:
SomeClass().call { // do something }
但是如果我在Kotlin中定义下面的方法(使用相同的接口):
fun call(something: Something) {}
然后这个电话:
call { // do something }
会产生一个类型不匹配的错误。 为什么?
Kotlin仅支持Java方法的SAM转换,因为Kotlin本身具有函数类型。 通常,Kotlin函数应该是() -> Unit
而不是Something
。 如果你真的需要它Something
,你可以使用一个SAM构造函数:
call(Something { /* do something */ })
任何SAM类型(具有一个抽象方法的Java接口)都会自动获得将lambda转换为其实例的构造函数。
Kotlin要求调用需要一些接口。
() -> Kotlin.Unit
不满足类型要求。
你可以这样做
call (object : Something { override fun doSomething() { println("Passing an interface to call in kotlin!") } })