web-dev-qa-db-fra.com

Invoquer une surcharge d'opérateur et d'opérateur dans Kotlin

Je connais l'opérateur Invoke qui,

a() est équivalent à a.invoke()

Y a-t-il quelque chose de plus concernant l'invocation de l'opérateur, veuillez expliquer. De plus, je n'ai reçu aucun exemple de surcharge d'opérateur Invoke.

La surcharge de l'opérateur Invoke est-elle possible? Si possible, quelqu'un peut-il s'il vous plaît expliquer la surcharge de l'opérateur Invoke avec un exemple. Je n'ai rien obtenu à ce sujet.

Merci d'avance.

13
Avijit Karmakar

Oui, vous pouvez surcharger invoke. Voici un exemple:

class Greeter(val greeting: String) {
    operator fun invoke(target: String) = println("$greeting $target!")
}

val hello = Greeter("Hello")
hello("world")  // Prints "Hello world!"

En plus de ce que @ holi-Java a dit, remplacer invoke est utile pour toute classe où il y a une action claire, en prenant éventuellement des paramètres. C'est aussi une excellente fonction d'extension pour Java classes de bibliothèque avec une telle méthode.

Par exemple, supposons que vous ayez la classe Java Java

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

Dans Kotlin, vous pouvez définir une extension sur ThingParser comme ceci:

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

Et l'utiliser comme ça

val parser = ThingParser()
val file = File("path/to/file")
val thing = parser(file)  // Calls Parser.invoke extension function
7
Ruckus T-Boom

La meilleure façon d'utiliser un opérateur invoke est de l'utiliser comme méthode d'usine , par exemple:

//          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)

C'est parce que objet compagnon est un objet spécial dans Kotlin. En effet, le code Data("1") ci-dessus est traduit en code comme ci-dessous:

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)
    }
}
5
holi-java