Kotlin運算符重載函數(shù)及作用場景
在 Kotlin 里,運算符重載函數(shù)允許為自定義類型重新定義現(xiàn)有的運算符(如 +
-
…)行為,從而讓自定義類型能像內(nèi)置類型那樣使用運算符
基本語法
若要重載運算符,需要定義一個帶有 operator 修飾符的函數(shù)。函數(shù)名必須是 Kotlin 預(yù)定義的運算符對應(yīng)的函數(shù)名?;菊Z法如下:
class YourClass { operator fun XXX(parameters): ReturnType { // 函數(shù)體 } }
作用場景
類對象
比如為我們的自定義類型添加加法運算
如下圖所示:+
對應(yīng)的函數(shù)名是plus
,+=
對應(yīng)的函數(shù)名是 plusAssign
class Student(val name: String, val age: Int) { //注意,二元運算符必須帶一個形參,表示右側(cè)的操作數(shù) operator fun plus(another: Student): Student { return Student(this.name + another.name, this.age+another.age) } } fun main() { val stu1 = Student("海賊王 ", 2) val stu2 = Student("我當(dāng)定了", 4) val result = stu1 + stu2 println("(${result.name}, ${result.age})") }
在這個例子中,Student類重載了 +
運算符,實現(xiàn)了兩個 Student對象的相加。stu1 + stu2
相當(dāng)于stu1.plus(stu2)
接下來舉一個重載一元運算符的例子,比如取反運算符:
class Student(val name: String, val age: Int) { operator fun not(): Student { return Student(name.reversed(), age) } } fun main() { val stu1 = Student("海賊王", 2) val stu2 = !stu1 println("(${stu2.name}, ${stu2.age})") }
!stu1
相當(dāng)于stu1.not()
數(shù)據(jù)類型
盡管基本數(shù)據(jù)類型(如 Int、Double 等)的內(nèi)置運算符已有默認行為,但可以為它們的擴展類型定義新的運算符行為。
// 為 Int 類型的擴展類重載 * 運算符 class Multiplier(val value: Int) { operator fun times(other: Int): Int { return this.value * other } } fun main() { val multiplier = Multiplier(5) val result = multiplier * 3 println(result) }
在上述代碼中,為 Multiplier 類重載了 * 運算符,讓 Multiplier 對象可以和 Int 類型的數(shù)據(jù)進行乘法運算。
接口
如果一個類實現(xiàn)了特定的接口,并且接口中定義了運算符重載函數(shù),那么該類對象也能使用這些重載的運算符。
interface Addable<T> { operator fun plus(other: T): T } class ComplexNumber(val real: Double, val imaginary: Double) : Addable<ComplexNumber> { override operator fun plus(other: ComplexNumber): ComplexNumber { return ComplexNumber(this.real + other.real, this.imaginary + other.imaginary) } } fun main() { val c1 = ComplexNumber(1.0, 2.0) val c2 = ComplexNumber(3.0, 4.0) val result = c1 + c2 println("(${result.real}, ${result.imaginary})") }
在這個例子中,ComplexNumber 類實現(xiàn)了 Addable 接口,并重載了 +
運算符,使得 ComplexNumber 對象可以使用 + 進行相加操作。
注意事項
- 運算符選擇:只能重載 Kotlin 預(yù)定義的運算符,不能創(chuàng)建新的運算符。
- 函數(shù)簽名:運算符重載函數(shù)的參數(shù)和返回值類型需要根據(jù)具體的運算符和業(yè)務(wù)需求來確定。
- 遵循約定:重載運算符時,應(yīng)盡量遵循該運算符在數(shù)學(xué)或邏輯上的常規(guī)語義,避免造成混淆。
到此這篇關(guān)于Kotlin-運算符重載函數(shù)的文章就介紹到這了,更多相關(guān)Kotlin運算符重載函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android端微信支付V3版本地簽名統(tǒng)一下單詳解
本篇文章主要介紹了android端微信支付V3版本地簽名統(tǒng)一下單,具有一定的參考價值,有興趣的同學(xué)可以了解一下。2016-11-11Android中RecyclerView實現(xiàn)滑動刪除與拖拽功能
這篇文章主要使用了RecyclerView的ItemTouchHelper類實現(xiàn)了Item的拖動和刪除功能,ItemTouchHelper是v7包下的一個類,下面來看看詳細的介紹吧,需要的朋友可以參考學(xué)習(xí)。2017-02-02android獲得當(dāng)前view在屏幕中坐標的方法
這篇文章主要介紹了android獲得當(dāng)前view在屏幕中坐標的方法,涉及Android針對view坐標相關(guān)屬性的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Android音頻開發(fā)之錄制音頻(WAV及MP3格式)
這篇文章主要為大家介紹了Android如何實現(xiàn)音頻文件的錄制(WAV及MP3格式),文中代碼具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12