Kotlin学习 - 运算符重载

在Java中,运算符基本是用于数字的计算:+ - * / % ++ –。在Kotlin中通过对运算符进行重载,允许任意两个对象进行相加,或者是进行更多其他的运算操作。

重载二元运算符

语法结构

class Obj {
    
    
	operator fun plus(obj: Obj): Obj {
    
     
		// 处理相加的逻辑
	} 
}

val obj1 = Obj()
val obj2 = Obj() 
val obj3 = obj1 + obj2

2、实例,实现一个Money类,重载plus方法:

class Money(val value: Int) {
    
    
    var sum: Int = 0
    operator fun plus(money: Money): Money {
    
    
 		sum = value + money.value
        return Money(sum)
    }
}

调用实现:

fun main() {
    
    
    val money1 = Money(5)
    val money2 = Money(6)
    val money3 = money1 + money2;
    println(money3.value)
}

//结果
11

上面例子就使用运算符重载实现了让两个Money对象相加的功能。Kotlin的语法糖,看下反编译后的Java代码:

Money money1 = new Money(5);
Money money2 = new Money(6);
Money money3 = money1.plus(money2);

看上面Java代码可以看到,运算符在编译时会替换成方法的调用,+替换成plus方法,Kotlin的每个运算符都有其对应的方法,其他同理也可以这样重载使用。

3、当然对象还可以和数字相加,在上面基础上我们在加一个重载方法

class Money(val value: Int) {
    
    
    var sum: Int = 0
    operator fun plus(money: Money): Money {
    
    
 		sum = value + money.value
        return Money(sum)
    }
    
	operator fun plus(newValue: Int): Money {
    
    
        sum = value + newValue
        return Money(sum)
	}
}

测试代码

fun main() {
    
    
    val money1 = Money(5)
    val money2 = Money(6)
    val money3 = money1 + money2;
    val money4 = money1 + 20;
    println(money3.value)
    println(money4.value)
}

//结果
11
25

反编译后的Java代码:

Money money1 = new Money(5);
Money money2 = new Money(6);
Money money3 = money1.plus(money2);
Money money4 = money1.plus(20);

各种运算符其对应的方法

表达式 函数名
a + b plus
a - b minus
a * b times
a / b div
a % b rem,mod(弃用)

重载复合赋值运算符

什么是复合赋值运算符?类似于+=这样的,合并了两步操作的运算符,同时运算和赋值称为复合运算符。

看个例子:

fun main() {
    
    
	val names = mutableListOf("Tom", "Lucky", "Daniel")
    names += "Alice"
    println(names)
    
    names -= "Daniel"
    println(names)
}
//结果
[Tom, Lucky, Daniel, Alice]
[Tom, Lucky, Alice]

集合中默认实现了复合运算符的实现方法,可以直接使用。

各种运算符其对应的方法

表达式 函数名
a += b plusAssign
a -= b minusAssign
a *= b timesAssign
a /= b divAssign
a %= b remAssign

Je suppose que tu aimes

Origine blog.csdn.net/kongqwesd12/article/details/131423296
conseillé
Classement