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 ->
...
})
以下是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 ->
...
})