----《第一季Kotlin崛起:次世代Android开发 》学习笔记
总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 对象进阶:类型别名
下一篇:每天学一点 Kotlin -- 对象进阶:反射
1. 操作符重载
1.1 一个明显的例子:不是所有的类型的都可以进行加减乘除运算。比如自定义的 Person 类。
1.2 如果想要对某些操作符提供新的功能,那就要进行操作符重载了。在章节:每天学一点 Kotlin -- 函数:操作符 中就已经学习过操作操作符的重载了。
1.3 下面对各种类型操作符相应的函数名进行总结:
(1) 一元操作符:(在这里,a 指代进行运算的类型)
“+a” 的函数名是 “unaryPlus”,
“-a” 的函数名是 “unaryMinus”,
“!a” 的函数名是 “not”,
“++” 的函数名是 “inc”,
“--” 的函数名是 “dec”;
(2) 二元操作符:(在这里,把 a 设为运算符左边的对象,b 设为运算符右边的对象)
“a+b” 的函数名是 “plus”,
“a-b” 的函数名是 “minus”,
“a*b” 的函数名是 “times”,
“a/b” 的函数名是 “div”,
“a%b” 的函数名是 “rem”,
“a..b” 的函数名是 “rangeTo”,
“in” 也是一个操作符,“a in b”的函数名是 “contains”,“a !in b”的函数名还是“contains”;
(3) 索引操作符:(在这里,a、b 表示对象,i、j 等其他字母表示索引)
“a[i]” 的函数名是 “get(i)”,
“a[i,j]” 的函数名是 “get(i,j)”,
“a[i_1,...,i_n]” 的函数名是 “get(i_1,...,i_n)”,
“a[i]=b” 的函数名是 “set(i,b)”,
“a[i,j]=b” 的函数名是 “set(i,j,b)”,
“a[i_1,...,i_n]=b” 的函数名是 “set(i_1,...i_n)”;
(4) 调用操作符:小括号“()”就是调用操作符(在这里,a 指代对象,i、j 等其他字母指代参数)
“a()” 的函数名是 “a.invoke()”,
“a(i)” 的函数名是 “a.invoke(i)”,
“a(i,j)” 的函数名是 “a.invoke(i,j)”,
“a(i_1,...,i_n)” 的函数名是 “a.invoke(i_1,...,i_n)”;
(5) 赋值类操作符:(在这里,a,b 指代对象)
“a+=b” 的函数名是 “a.plusAssign(b)”,
“a-=b” 的函数名是 “a.minusAssign(b)”,
“a*=b” 的函数名是 “a.timesAssign(b)”,
“a/=b” 的函数名是 “a.divAssign(b)”,
“a%=b” 的函数名是 “a.modAssign(b)”,
相等、不相等的操作符只要重写超类 Any 中的 equals() 方法就可以了,
其他的四个比较操作符“>”“>=”“<”“<=”需要实现 Comparable 泛型接口。
2. 举个栗子
2.1 在章节:每天学一点 Kotlin -- 函数:操作符 的基础上,补充一些遗漏的例子
2.2 重载一元操作符举例:
class OperatePerson(name: String, age: Int) {
val name = name
val age = age
}
operator fun OperatePerson.unaryPlus() = OperatePerson(this.name, this.age + 1)
fun testOperate1() {
val p = OperatePerson("xiaoMing", 20)
println((+p).age)
}
fun main() {
testOperate1()
}
打印结果:
21
因为是重载,所以可以自定义操作符里面的逻辑,修改如下:
operator fun OperatePerson.unaryPlus() = OperatePerson(this.name, this.age + 3)
operator fun OperatePerson.unaryMinus() = OperatePerson(this.name, this.age - 3)
fun testOperate1() {
val p = OperatePerson("xiaoMing", 20)
println((+p).age)
val p1 = OperatePerson("xiaoMing", 20)
println((-p1).age)
}
fun main() {
testOperate1()
}
打印结果:
23
17
2.3 重载二元操作符举例:
见章节:每天学一点 Kotlin -- 函数:操作符 中的 2.5
2.4 重载索引操作符举例:
见章节:每天学一点 Kotlin -- 函数:操作符 中的 2.6.1
2.5 重载调用操作符
见章节:每天学一点 Kotlin -- 函数:操作符 中的 2.6.2
2.6 重载赋值类操作符
见章节:每天学一点 Kotlin -- 函数:操作符 中的 2.6.3,是直接重写了操作符 compareTo() 的方法。下面看一下实现 Comparable 泛型接口的实例。
class OperatePerson1(name: String, age: Int) : Comparable<OperatePerson1> {
val name = name
val age = age
override fun compareTo(other: OperatePerson1): Int {
return if (this.age > other.age) {
1
} else if (this.age < other.age) {
-1
} else {
0
}
}
}
fun testOperate2() {
val p1 = OperatePerson1("xiaoMing", 20)
val p2 = OperatePerson1("xiaoHong", 21)
if (p1 > p2) {
println("${p1.name} 年龄大于 ${p2.name}")
} else if (p1 < p2) {
println("${p1.name} 年龄小于于 ${p2.name}")
} else {
println("${p1.name} 年龄和 ${p2.name} 相等")
}
}
fun main() {
testOperate2()
}
打印结果:
xiaoMing 年龄小于于 xiaoHong