0

以下是从 Java 用 Kotlin 重写的方法:

fun publishMessageSource(
        name: String,
        address: String,
        completionHandler: Handler<AsyncResult<Unit>>
) {
    val record = MessageSource.createRecord(name, address)
    publish(record, completionHandler)
}

但是,当我这样称呼它时:

publishMessageSource("market-data", ADDRESS, { record: Handler<AsyncResult<Unit>> ->
            if (!record.succeeded()) {
                record.cause().printStackTrace()
            }
            println("Market-Data service published : ${record.succeeded()}")
        })

我得到错误Type Mismatch required Handler<AsyncResult<Unit>> found (Handler<AsyncResult<Unit>>) -> Unit

我究竟做错了什么?

4

1 回答 1

3

您的 lambda 应该采用Handler接口的单个​​方法采用的参数,AsyncResult<Unit>在这种情况下。您的 lambdaHandler因此它不将Handler用作参数。

我认为您还需要在这里显式调用 SAM 构造函数,因为您的函数是用 Kotlin 编写的,看起来像这样:

publishMessageSource("market-data", ADDRESS, Handler<AsyncResult<Unit>> { record: AsyncResult<Unit>  ->
    ...
})

这将创建一个Handler<AsyncResult<Unit>>带有表示其单个方法的 lambda。

最后,您可以省略 lambda 中的类型以减少冗余:

publishMessageSource("market-data", ADDRESS, Handler<AsyncResult<Unit>> { record ->
    ...
})
于 2017-06-26T19:42:17.697 回答