Kotlin lambda编译反对java API但不反对我自己的函数

时间:2018-04-26 21:25:15

标签: android lambda kotlin

这是一个简化的例子。此语法有效:

Handler().post({Log.v(TAG, "test")})

但是,如果我定义了这个功能

private fun doWithRunnable(toRun:Runnable) {
    // whatever
}

并像这样称呼它

doWithRunnable({Log.v(TAG, "test")})

然后我收到以下错误:

  

必需:Runnable
发现:() - > INT

这两个签名对我来说都是一样的......什么是最重要的区别?

1 个答案:

答案 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必须在顶级声明,不能在类或方法中声明。