In Kotlin wird die Operatorüberladung (operator overloading) durch das Schlüsselwort operator unterstützt. Dies ermöglicht es, die eigene Logik für die Standardoperatoren (+, -, *, [], == usw.) für benutzerdefinierte Typen zu definieren:
operator versehen werden.Beispiel:
data class Vec2(val x: Int, val y: Int) { operator fun plus(other: Vec2) = Vec2(x + other.x, y + other.y) } val a = Vec2(1,2) val b = Vec2(2,3) val c = a + b // ruft operator fun plus auf
Nuancen und Best Practices:
== und equals übereinstimmen).Was ist der Unterschied zwischen der Überladung des Operators
==und der Überschreibung der Methodeequals()?
Antwort: Der Operator == in Kotlin ruft immer die Methode equals() auf (mit einer vorherigen Null-Prüfung). Wenn Sie die operator fun equals(other: Any?): Boolean definieren, wird dieser Methode immer der Operator == verwendet. Es ist nicht möglich, dass == und equals() unterschiedlich arbeiten.
data class Point(val x: Int, val y: Int) { override operator fun equals(other: Any?): Boolean { ... } } val a = Point(1,2) val b = Point(1,2) println(a == b) // ruft a.equals(b) auf
Geschichte
Überlastete den Operator compareTo ohne eindeutige Semantik:
Im Punkt-Klasse definierten wir operator fun compareTo, um ihn in Sortierungen verwenden zu können. Jedoch hatten „größer“ und „kleiner“ keine eindeutige Bedeutung, verschiedene Teammitglieder schrieben unterschiedliche Logik. Das Ergebnis waren verworrene Fehler bei der Sortierung von Sammlungen.
Geschichte
Symmetrie der Operatoren für gegenseitige Typen vergessen:
Der Entwickler implementierte operator fun plus(a: Matrix, b: Vector): Matrix, stellte aber nicht die Funktion für Vector + Matrix bereit, da er die symmetrische Funktion nicht implementiert hatte. Infolgedessen wurde der Ausdruck vector + matrix nicht kompiliert, nur matrix + vector funktionierte. Dies führte zu Fehlern in vielen Teilen des Codes.
Geschichte
Fehlerhafte Überladung des Operators get:
Der Entwickler erstellte eine benutzerdefinierte Klasse und überlud operator fun get(index: Int): Foo. Er fügte keine Überprüfung für den Bereich hinzu – und der Versuch, auf ein nicht vorhandenes Element zuzugreifen, gab ein Objekt mit ungültigen Feldern zurück, anstatt eine Ausnahme auszulösen – was zu "unsichtbaren" Fehlern in der Geschäftslogik führte.