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
| Operador | Função | Exemplo |
|---|---|---|
+ | plus | a + b |
- | minus | a - b |
* | times | a * b |
/ | div | a / b |
[] | get / set | a[i] |
== | equals | a == b |
> < | compareTo | a > b |
in | contains | x 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.