考虑以下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
}
会生成类型不匹配错误。为什么呢?
答案 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!")
}
})