Kotlin的运算符都是靠特定名称的方法支撑的,因此只要重载这些名称的方法,我们就可以为任意类添加这些运算符。
重载运算符的方法需要用operator修饰符进行标记。
1、重载单目前缀运算符
单目前缀运算符有"+","-","!"
fun main(args: Array<String>) {
val data: Data = Data(3, 4)
//输出:+data : x = 4, y = 5
println("+data : ${+data}")
//输出:-data : x = 2, y = 3
println("-data : ${-data}")
//输出:!data : x = -3, y = -4
println("!data : ${!data}")
}
class Data(val x: Int, val y: Int) {
operator fun unaryPlus(): Data {
return Data(x + 1, y + 1)
}
operator fun unaryMinus(): Data {
return Data(x - 1, y - 1)
}
operator fun not(): Data {
return Data(-x, -y)
}
override fun toString(): String {
return "x = ${x}, y = ${y}"
}
}
2、自加和自减运算符
自加:++,自减:–
fun main(args: Array<String>) {
var data: Data = Data(3, 4)
//输出:+data : x = 4, y = 5
println("data++ : ${data++}")
//输出:-data : x = 2, y = 3
println("data-- : ${data--}")
}
class Data(var x: Int, var y: Int) {
operator fun inc(): Data {
return Data(x++, y++)
}
operator fun dec(): Data {
return Data(x--, y--)
}
override fun toString(): String {
return "x = ${x}, y = ${y}"
}
}
3、双目算术运算符
例子同以上,重载其对应方法即可
4、in和!in运算符
例子同以上,重载其对应方法即可
5、索引访问运算符
fun main(args: Array<String>) {
var str = "fkjava.org"
//根据get方法来获取指定索引处的字符,输j
println(str.get(2))
//使用索引访问运算符来获取指定索引处的字符,输出j
println(str[2])
var list = ArrayList<String>()
list.add("Java")
list.add("Kotlin")
list.add("Go")
//使用索引访问运算符来获取指定索引处的字符,输出Kotlin
println(list[1])
list[2] = "Swift"
//使用索引访问运算符来修改指定索引处的字符,输出[Java,Kotlin,Swift]
println(list)
}
6、调用运算符
fun main(args: Array<String>) {
val str = "java.lang.String"
val mtd = Class.forName(str).getMethod("length")
//使用传统方法,使用Method对象的invoke方法,输出4
println(mtd.invoke("Java"))
//使用调用运算符,输出4
println(mtd("Java"))
}