Vert.x Kotlin Тип Несоответствие требуется Обработчик <AsyncResult <Unit >> found (Обработчик <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 .

Что я делаю не так?

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

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

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

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

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

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