输出结果为:
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的对比由于篇幅原因,请看
五、总结