Vert.x 需要 Kotlin 类型不匹配 Handler<AsyncResult<Unit>> 已找到 (Handler<AsyncResult<Unit>>) -> Unit

Vert.x Kotlin Type Mismatch required Handler<AsyncResult<Unit>> found (Handler<AsyncResult<Unit>>) -> Unit

以下是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

我做错了什么?

您的 lambda 应该采用 Handler 接口的单一方法采用的参数,在本例中为 AsyncResult<Unit>。您的 lambda Handler,因此它不会将 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 ->
    ...
})