¿Cómo llamar al método Kotlin con más de una firma similar con lambda?

Estoy usando algún código de esta biblioteca: https://github.com/Netflix-Skunkworks/rewrite

Cuando llamo a uno de sus methods, encuentro un error IDE:

No se puede invocar ninguna de las siguientes funciones con los arguments suministrados.

El método objective tiene dos firmas similares:

data class ComstacktionUnit(...){ fun refactor() = Refactor(this) fun refactor(ops: Refactor.() -> Unit): Refactor { val r = refactor() ops(r) return r } fun refactor(ops: Consumer<Refactor>): Refactor { val r = refactor() ops.accept(r) return r } } 

El código de llamada en Kotlin:

 val unit: ComstacktionUnit =... unit.refactor{ tx -> doSomeThing() } 

Y esta llamada con lambda está bien en Java:

 ComstacktionUnit unit = .... unit.refactor(tx -> { doSomeThing() }); 

Puede corregir el código de llamada en Kotlin: está pasando una lambda con un argumento { tx -> doSomething() } , pero allí se espera una lambda con receptor y sin arguments.

Compare: (Refactor) -> Unit es el tipo para una function con un argumento, mientras que Refactor.() -> Unit significa una function con receptor , que no toma arguments y en su lugar se pasa un receptor ( this ) de tipo Refactor . Estos types a veces son intercambiables, pero las lambdas no se convierten implícitamente entre ellos.

Entonces, puede llamar a refactor la siguiente manera:

 val unit: ComstacktionUnit = ... unit.refactor { doSomeThing() // this code can also work with `this` of type `Refactor` } 

Alternativamente, para llamar a la sobrecarga con Consumer<Refactor> , puede especificar explícitamente que:

 unit.refactor(Consumer { tx -> doSomething() }) 

La conversión SAM implícita aparentemente no está disponible porque hay varias sobrecargas con parameters funcionales.