Kotlin运算符重载函数及作用场景

 更新时间:2025年05月06日 10:45:27   作者:el psy congroo  
在 Kotlin 里,运算符重载函数允许为自定义类型重新定义现有的运算符(如 + -…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算符重载函数,感兴趣的朋友一起看看吧

在 Kotlin 里,运算符重载函数允许为自定义类型重新定义现有的运算符(如 + -…)行为,从而让自定义类型能像内置类型那样使用运算符

基本语法

若要重载运算符,需要定义一个带有 operator 修饰符的函数。函数名必须是 Kotlin 预定义的运算符对应的函数名。基本语法如下:

class YourClass {
    operator fun XXX(parameters): ReturnType {
        // 函数体
    }
}

作用场景

类对象

比如为我们的自定义类型添加加法运算

如下图所示:
+对应的函数名是plus,
+=对应的函数名是 plusAssign

class Student(val name: String, val age: Int) {
    //注意,二元运算符必须带一个形参,表示右侧的操作数
    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("我当定了", 4)
    val result = stu1 + stu2
    println("(${result.name}, ${result.age})")
}


在这个例子中,Student类重载了 + 运算符,实现了两个 Student对象的相加。stu1 + stu2相当于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相当于stu1.not()

数据类型

尽管基本数据类型(如 Int、Double 等)的内置运算符已有默认行为,但可以为它们的扩展类型定义新的运算符行为。

// 为 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 类型的数据进行乘法运算。

接口

如果一个类实现了特定的接口,并且接口中定义了运算符重载函数,那么该类对象也能使用这些重载的运算符。

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 类实现了 Addable 接口,并重载了 + 运算符,使得 ComplexNumber 对象可以使用 + 进行相加操作。

注意事项

  • 运算符选择:只能重载 Kotlin 预定义的运算符,不能创建新的运算符。
  • 函数签名:运算符重载函数的参数和返回值类型需要根据具体的运算符和业务需求来确定。
  • 遵循约定:重载运算符时,应尽量遵循该运算符在数学或逻辑上的常规语义,避免造成混淆。

到此这篇关于Kotlin-运算符重载函数的文章就介绍到这了,更多相关Kotlin运算符重载函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android短信发送器实现方法

    Android短信发送器实现方法

    这篇文章主要介绍了Android短信发送器实现方法,以实例形式较为详细的分析了Android短信发送器从界面布局到功能实现的完整步骤与相关技巧,需要的朋友可以参考下
    2015-09-09
  • android端微信支付V3版本地签名统一下单详解

    android端微信支付V3版本地签名统一下单详解

    本篇文章主要介绍了android端微信支付V3版本地签名统一下单,具有一定的参考价值,有兴趣的同学可以了解一下。
    2016-11-11
  • 教你一文搞懂Kotlin中的Jvm注解

    教你一文搞懂Kotlin中的Jvm注解

    这篇文章主要介绍了教你一文搞懂Kotlin中的Jvm注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Android中Intent与Bundle的使用详解

    Android中Intent与Bundle的使用详解

    这篇文章主要给大家总结介绍了关于Android中传值Intent与Bundle的关系,文中通过示例代码以及图文介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧<BR>
    2022-11-11
  • Android中RecyclerView实现滑动删除与拖拽功能

    Android中RecyclerView实现滑动删除与拖拽功能

    这篇文章主要使用了RecyclerView的ItemTouchHelper类实现了Item的拖动和删除功能,ItemTouchHelper是v7包下的一个类,下面来看看详细的介绍吧,需要的朋友可以参考学习。
    2017-02-02
  • android获得当前view在屏幕中坐标的方法

    android获得当前view在屏幕中坐标的方法

    这篇文章主要介绍了android获得当前view在屏幕中坐标的方法,涉及Android针对view坐标相关属性的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android中访问sdcard路径的几种方式

    Android中访问sdcard路径的几种方式

    本文主要介绍了Android中访问sdcard路径的几种方式。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Android仿微信多人音视频通话界面

    Android仿微信多人音视频通话界面

    这篇文章主要为大家详细介绍了Android仿微信多人音视频通话界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android音频开发之录制音频(WAV及MP3格式)

    Android音频开发之录制音频(WAV及MP3格式)

    这篇文章主要为大家介绍了Android如何实现音频文件的录制(WAV及MP3格式),文中代码具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Android图片压缩上传之基础篇

    Android图片压缩上传之基础篇

    这篇文章主要介绍了Android图片压缩上传之基础篇的相关内容,本文介绍的非常详解,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-05-05

最新评论