O que é Operator Overloading em Kotlin?

Operator Overloading (sobrecarga de operadores) permite redefinir o comportamento de operadores como +, -, *, [], == e outros para suas próprias classes. Você escreve funções especiais marcadas com operator e pronto — seus objetos passam a funcionar com a sintaxe natural de operadores.

Exemplo básico: somando vetores

data class Vetor(val x: Double, val y: Double) {
    operator fun plus(outro: Vetor) = Vetor(x + outro.x, y + outro.y)
    operator fun minus(outro: Vetor) = Vetor(x - outro.x, y - outro.y)
    operator fun times(escalar: Double) = Vetor(x * escalar, y * escalar)
}

fun main() {
    val a = Vetor(1.0, 2.0)
    val b = Vetor(3.0, 4.0)

    println(a + b)      // Vetor(x=4.0, y=6.0)
    println(a - b)      // Vetor(x=-2.0, y=-2.0)
    println(a * 3.0)    // Vetor(x=3.0, y=6.0)
}

Principais operadores

OperadorFunçãoExemplo
+plusa + b
-minusa - b
*timesa * b
/diva / b
[]get / seta[i]
==equalsa == b
> <compareToa > b
incontainsx in a

Operadores de acesso: get e set

class Matriz(private val dados: Array<IntArray>) {
    operator fun get(linha: Int, coluna: Int): Int = dados[linha][coluna]
    operator fun set(linha: Int, coluna: Int, valor: Int) {
        dados[linha][coluna] = valor
    }
}

fun main() {
    val m = Matriz(arrayOf(intArrayOf(1, 2), intArrayOf(3, 4)))
    println(m[0, 1]) // 2
    m[1, 0] = 99
    println(m[1, 0]) // 99
}

Operador invoke

O operador invoke permite chamar um objeto como se fosse uma função:

class Validador(val regex: Regex) {
    operator fun invoke(valor: String): Boolean = regex.matches(valor)
}

fun main() {
    val validarEmail = Validador(Regex("^[\\w.-]+@[\\w.-]+\\.[a-z]{2,}$"))
    println(validarEmail("karina@kotlin.dev.br")) // true
    println(validarEmail("invalido"))              // false
}

Boas práticas

Use operator overloading com moderação. O operador deve ter um significado intuitivo para quem lê o código. Somar dois vetores faz sentido; “somar” dois usuários, nem tanto. Quando bem aplicado, operator overloading deixa o código expressivo e natural.