Vert.x Kotlin Type Несоответствие типов Требуется обработчик<AsyncResult <Unit >> (Обработчик<AsyncResult <Unit >>) -> Unit

Ниже приведен метод, переписанный в Kotlin из Java:

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,

Что я делаю неправильно?

1 ответ

Решение

Ваша лямбда должна принять параметр, который единственный метод Handler интерфейс принимает, что AsyncResult<Unit> в этом случае. Ваша лямбда это Handlerтак что это не займет Handler в качестве параметра.

Я думаю, что вам также понадобится явный вызов конструктора SAM, поскольку ваша функция написана на Kotlin, это будет выглядеть примерно так:

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

Это создает Handler<AsyncResult<Unit>> с лямбда, представляющим его единственный метод.

Наконец, вы можете опустить тип внутри лямбды, чтобы он был менее избыточным:

publishMessageSource("market-data", ADDRESS, Handler<AsyncResult<Unit>> { record ->
    ...
})
Другие вопросы по тегам