Kotlin——最详细的操作符与操作符重载详解(上) (2)

输出结果为:

a + d = 10Kotlin c + d = 2Kotlin a + b = 12 a - b = 8 a * b = 20 a / b = 5 a % b = 0 a .. d = 10..2 a + b = 12 a - b = 8 a * b = 20 a / b = 5 a % b = 0 a .. d = 10..2

在此处贴上Kotlin操作符中plus()函数的源码。

public operator fun plus(other: Byte): Double public operator fun plus(other: Short): Double public operator fun plus(other: Int): Double public operator fun plus(other: Long): Double public operator fun plus(other: Float): Double public operator fun plus(other: Double): Double

可以看出,plus()方法只支持数值型。详细的其他操作符重载可以看源码中的Primitives.kt文件。其中的operator修饰符为定义一个重载操作符函数的关键字。在下面会实例讲解。

2.2.2、复合二元操作

复合的二元操作有:

a += b,表示第一个操作数的的值为第一个操作数加上第二个操作数,值得注意的是若某一个操作数为String类型时。其返回值为String类型,当且仅当两个操作数都为数值型时,其返回值才会数值型。

a -= b,表示第一个操作数的的值为第一个操作数减去第二个操作数,返回值为数值型

a *= b,表示第一个操作数的的值为第一个操作数乘以第二个操作数,返回值为数值型

a /= b,表示第一个操作数的的值为第一个操作数除以第二个操作数,返回值为数值型

a %= b,表示第一个操作数的的值为第一个操作数模以第二个操作数 。返回值为Int型

这里提供一个表格直观的展示:

操作符 表示 重载
a += b   a = a + b   a = a.plus(b)  
a -= b   a = a - b   a = a.minus(b)  
a *= b   a = a * b   a = a.tiems(b)  
a /= b   a = a / b   a = a.div(b)  
a %= b   a = a % b   a = a.rem(b)  
2.2.2.1 普通的二元操作

这里所指的普通,是对操作数为普通的类型而言。

例:Java版本

var b = 2 var a = 10 var c = "Kotlin" a += b print("a = $a \t") // 主要演示字符串的+= c += a print("c = $c \t") a = 10 a -= b print("a = $a \t") a = 10 a *= b print("a = $a \t") a = 10 a /= b print("a = $a \t") a = 10 a += b print("a = $a \t")

输出结果为:

a = 12 c = Kotlin12 a = 8 a = 20 a = 5 a = 12

或许你会说这里为什么没有Kotlin的版本呢?你在看官方文档或者其他人一些博客文章的时候可能有这样a += b <=> a.plusAssign()的操作。但是我告诉你a.plusAssign()不是这样用的,你可以看源码知道primitives.kt文件中肯本就不存在plusAssign()这个方法。因为Koltin中赋值不是表达式。即 a += b <=> a = a + b在Kotlin中是a = a.plus(b)。

还有一点就是:如果我的第一个操作数定义为val(不可变)类型时,a += b这个表达式会直接爆红。

例:Koltin版本

a = 10 a = a.plus(b) println("a = $a \t") a = 10 c = c.plus(a) print("c = $c \t" ) a = 10 a = a.minus(b) println("a = $a \t") a = 10 a = a.times(b) println("a = $a \t") a = 10 a = a.div(b) println("a = $a \t") a = 10 a = a.rem(b) println("a = $a \t")

输出结果为:

a = 12 c = Kotlin1210 a = 8 a = 20 a = 5 a = 0

上面说到了在源码primitievs.kt文件中不存在plusAssign()、minusAssign()、timesAssign()、divAssign()、remAssign()这些方法。那为什么官方文档上会存在呢?这里这里不做详解,但是我会在自定义重载操作符方法的时候给大家说明,请大家详细的往下看,一些更高级的操作

2.2.2.2 高级的二元操作

这里的高级二元操作,指的是操作数为一个集合,不过只能使用+=和-=。即(plusAssign()和minusAssign())

实例讲解:

var arrA = arrayListOf<String>("1","2","3","4") var arrB = arrayListOf<String>("1","2","3","4") arrA.plusAssign(arrB) for (a in arrA){ print("$a \t") }

输出结果为:

1 2 3 4 1 2 3 4

源码分析:MutableCollections.kt文件下

/** * Adds the specified [element] to this mutable collection. */ @kotlin.internal.InlineOnly public inline operator fun <T> MutableCollection<in T>.plusAssign(element: T) { this.add(element) } /** * Adds all elements of the given [elements] collection to this mutable collection. */ @kotlin.internal.InlineOnly public inline operator fun <T> MutableCollection<in T>.plusAssign(elements: Iterable<T>) { this.addAll(elements) }

结果可以看出,只是调用了集合中我们熟知的add()、addAll()、remove()等方法。没什么用!

2.3、比较操作

由于篇幅原因,请看

2.4、位运算操作

由于篇幅原因,请看

2.4、区间操作

由于篇幅原因,请看

2.5、集合操作

由于篇幅原因,请看

三、自定义操作符的重载方法

由于篇幅原因,请看

四、和Java的对比

由于篇幅原因,请看

五、总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyywj.html