Kotlin中的Lambda表达式

时间:2014-10-22 12:07:24

标签: java lambda kotlin

考虑以下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
}

会生成类型不匹配错误。为什么呢?

2 个答案:

答案 0 :(得分:27)

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

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

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

答案 1 :(得分:10)

Kotlin要求调用采用接口something

() -> Kotlin.Unit

不符合类型要求。

你可以这样做

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