Invocar sobrecarga de operador y operador en Kotlin

Conozco sobre el operador Invoke que,

a() es equivalente a a.invoke()

¿Hay algo más sobre el operador Invoke? Explique por favor. Además, no recibí ningún ejemplo de sobrecarga del operador Invoke.

¿Es posible sobrecargar el operador Invoke? Si es posible, ¿puede alguien explicar la sobrecarga del operador Invoke con un ejemplo? No recibí nada sobre esto.

Gracias por adelantado.

Sí, puedes sobrecargar la invoke . Aquí hay un ejemplo:

 class Greeter(val greeting: String) { operator fun invoke(target: String) = println("$greeting $target!") } val hello = Greeter("Hello") hello("world") // Prints "Hello world!" 

Además de lo que dijo @ holi-java, anular la invoke es útil para cualquier class donde haya una acción clara, opcionalmente tomando parameters. También es excelente como una function de extensión para las classs de biblioteca de Java con dicho método.

Por ejemplo, supongamos que tiene la siguiente class de Java

 public class ThingParser { public Thing parse(File file) { // Parse the file } } 

En Kotlin, puede definir una extensión en ThingParser de la siguiente manera:

 operator fun ThingParser.invoke(file: File) = parse(file) 

Y úsalo como tal

 val parser = ThingParser() val file = File("path/to/file") val thing = parser(file) // Calls Parser.invoke extension function 

La mejor manera de usar un operador de invocación es usarlo como un Método de Fábrica , por ejemplo:

 // v--- call the invoke(String) operator val data1 = Data("1") // v--- call the invoke() operator val default = Data() // v-- call the constructor val data2 = Data(2) 

Esto se debe a que el object complementario es un object especial en Kotlin. De hecho, el código de Data("1") anterior se traduce al código de la siguiente manera:

 val factory:Data.Companion = Data // v-- the invoke operator is used here val data1:Data = factory.invoke("1") 

 class Data(val value: Int) { companion object { const val DEFAULT =-1 // v--- factory method operator fun invoke(value: String): Data = Data(value.toInt()) // v--- overloading invoke operator operator fun invoke(): Data = Data(DEFAULT) } }