这是一个简化的例子。此语法有效:
Handler().post({Log.v(TAG, "test")})
但是,如果我定义了这个功能
private fun doWithRunnable(toRun:Runnable) {
// whatever
}
并像这样称呼它
doWithRunnable({Log.v(TAG, "test")})
然后我收到以下错误:
必需:Runnable
发现:() - > INT
这两个签名对我来说都是一样的......什么是最重要的区别?
答案 0 :(得分:1)
在您的Java示例中,您正在利用SAM Conversions的Java-interop功能。不幸的是,这对Kotlin界面目前不起作用,因为设计师认为没有必要(有关此问题的讨论见here)。
相反,你想做的事情如下:
fun doWithRunnable(runnable: () -> Any) {
// call it as `runnable()`
}
如果您愿意,也可以为此定义typealias(这与Kotlin的SAM语法非常接近):
typealias RunMe = () -> Any
fun doWithRunnable(runnable: RunMe) {
runnable()
}
请注意,目前,typealiases必须在顶级声明,不能在类或方法中声明。