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转换为其实例的构造函数.
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)
| 归档时间: |
|
| 查看次数: |
7611 次 |
| 最近记录: |