En Kotlin, se admite la sobrecarga de operadores (operator overloading) a través de la palabra clave operator. Esto permite definir la propia lógica de funcionamiento de los operadores estándar (+, -, *, [], ==, etc.) para tipos de usuario:
operator.Ejemplo:
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 // llamará a operator fun plus
Matices y mejores prácticas:
== y equals deben estar en concordancia).¿Cuál es la diferencia entre la sobrecarga del operador
==y la anulación del métodoequals()?
Respuesta: El operador == en Kotlin siempre llama al método equals() (con una verificación previa de null). Si define operator fun equals(other: Any?): Boolean, el operador == siempre usará este método. No se puede hacer que == y equals() funcionen de manera diferente.
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) // llamará a a.equals(b)
Historia
Se sobrecargó el operador compareTo sin una semántica clara:
En la clase Point, se definió operator fun compareTo para poder utilizarlo en ordenamientos. Sin embargo, "mayor" y "menor" no tenían un sentido claro, diferentes miembros del equipo escribieron diferentes lógicas. El resultado: errores confusos al ordenar colecciones.
Historia
Se olvidó la simetría de los operadores para tipos mutuos:
Un desarrollador implementó operator fun plus(a: Matrix, b: Vector): Matrix, pero no proporcionó la operación para Vector + Matrix, ya que no implementó una función simétrica.
Como resultado, la expresión vector + matrix no se compilaba, solo matrix + vector funcionaba. Esto causó errores en muchas partes del código.
Historia
Sobrecarga errónea del operador get:
Un desarrollador creó una clase personalizada sobrecargando operator fun get(index: Int): Foo. No agregó verificaciones de límites, y el intento de acceso a un elemento inexistente devolvía un objeto con campos no válidos, en lugar de lanzar una excepción, lo que llevó a la aparición de errores "invisibles" en la lógica de negocios.