美文网首页
kotlin 基础之运算符重载

kotlin 基础之运算符重载

作者: ifjgm | 来源:发表于2019-05-28 19:35 被阅读0次

    我们知道Java 中是不允许运算符重载的,1+1,输出肯定是2,kotlin 则可以重载。可见 kotlin 官网

    '+' 运算符的重载

    kotlin 官网我们可以看到关于加法运算符的解释,如下所示。

    image
    • 我们定义一个类 Complex(复数),有两个属性real 实部,imagary虚部。
    class Complex(var real: Double, var imagnary: Double) {
    
    
        //重载 + 号参数
        operator fun plus(other: Complex): Complex {
            return Complex(real + other.real, imagnary + other.imagnary)
        }
    
        //重载对参数和返回值没有要求,只要 operate 关键字+ 方法名相同,参数数量相同即可
        operator fun plus(other: Int):Int{
            return real.toInt()+other
        }
    
    
        //复写
        override fun toString(): String {
            return "$real+${imagnary}i"
    
        }
    
    }
    //调用重载后方法
    fun main(args: Array<String>) {
        val a = Complex(1.0, 2.0)
        val b = Complex(5.0, 7.9)
        val c=10
        println(a+b)
        println (a+c)
      
    
    • 重载对参数和返回值没有要求,只要 operate 关键字和方法名相同,参数数量相同即可。

    再重载个‘()’invoke 方法

    首先还是先看下官网中关于运算符()的解释。

    image
    • 重载()invoke 方法,我们把它重载为一个打印hellworld 的方法吧
    class Complex(var real: Double, var imagnary: Double) {
    
        //重载()invoke 方法,我们把它重载为一个打印hellworld 的方法把
        operator fun invoke(){
            println("hello world!!")
        }
    
    
    }
    
    
    fun main(args: Array<String>) {
        val a = Complex(1.0, 2.0)
        a()
    
      
    }
    

    中缀表达式

    另外由于中缀表达式可以定义像运算符一样的函数,所以这里顺带说下中缀表达式

    • 在普通的一个只有一个参数的方法前面加一个infix 就是中缀表达式了。
    • 我们在Desk 类中定一个一个on 方法,它接收一个参数(物体的名称),然后打印出该物体在桌子上。
    
    class Desk{
    
        //中缀表达式,普通的方法前面加个 infix 就是中缀表达式
        infix fun On(name:String){
            println("$name on the Desk!!")
        }
    }
    
    fun main(args: Array<String>) {
           val desk=Desk()
       
       //中缀表达式的调用,可以省略 .  和 ()。不过这玩意有啥用呢?随便还是不要用的好,不容易阅读。
        desk On "a lot of books"
    }
    
    
    • 调用的时候可以省略 . 和 () ,除了看起来简洁,但会使得代码更难阅读,所以还是不要用的好。

    总结

    • 任意类可以定义或重载父类的基本运算符
    • 通过运算符对应的具名函数来定义
    • 参数的个数必须和运算符原来的具名函数相同,但对于参数和返回值的类型不做要求
    • 可以重载的运算符有限,不像scalar 可以任意定义。

    源码地址

    github 源码地址

    相关文章

      网友评论

          本文标题:kotlin 基础之运算符重载

          本文链接:https://www.haomeiwen.com/subject/rbjjtctx.html