Перегрузка операторов — это возможность определять собственное поведение для стандартных операторов (+
, -
, *
, /
, ==
и др.) при работе с пользовательскими типами данных. Это позволяет использовать привычные операторы для объектов ваших классов.
data class Vector(val x: Int, val y: Int) {
operator fun plus(other: Vector) = Vector(x + other.x, y + other.y)
}
val v1 = Vector(1, 2)
val v2 = Vector(3, 4)
println(v1 + v2) // Вывод: Vector(x=4, y=6)
В Kotlin перегрузка реализуется через специальные функции с ключевым словом operator
. Каждому оператору соответствует определённое имя функции:
Оператор | Функция | Пример использования |
---|---|---|
+ | plus | a + b |
- | minus | a - b |
* | times | a * b |
/ | div | a / b |
== | equals | a == b |
> | compareTo | a > b |
[] | get/set | a[i] |
.. | rangeTo | 1..10 |
Сравните два варианта:
matrix1.add(matrix2).multiply(scalar)
(matrix1 + matrix2) * scalar
Для математических, физических и других специализированных типов:
class Complex(val real: Double, val imaginary: Double) {
operator fun plus(other: Complex) =
Complex(real + other.real, imaginary + other.imaginary)
}
val c1 = Complex(1.0, 2.0)
val c2 = Complex(3.0, 4.0)
println(c1 + c2) // Complex(real=4.0, imaginary=6.0)
Перегрузка операторов активно используется при создании предметно-ориентированных языков:
html {
head {
title { +"Page Title" }
}
body {
h1 { +"Header" }
}
}
data class Money(val amount: Int, val currency: String) {
operator fun compareTo(other: Money) = amount.compareTo(other.amount)
}
val money1 = Money(100, "USD")
val money2 = Money(200, "USD")
println(money1 < money2) // true
class Matrix(private val data: Array<IntArray>) {
operator fun get(row: Int, col: Int) = data[row][col]
operator fun set(row: Int, col: Int, value: Int) {
data[row][col] = value
}
}
val matrix = Matrix(arrayOf(intArrayOf(1, 2), intArrayOf(3, 4)))
println(matrix[1, 0]) // 3
matrix[1, 0] = 5
class Adder(val x: Int) {
operator fun invoke(y: Int) = x + y
}
val adder = Adder(5)
println(adder(3)) // 8
==
, перегрузите и hashCode()
Перегрузка операторов позволяет:
Основные применения:
Лучшие практики:
Перегрузка операторов — мощный инструмент, который при грамотном использовании делает код более естественным и выразительным, особенно в предметно-ориентированных областях.