Kotlin运算符重载
2019-06-26 本文已影响10人
程序员丶星霖
Kotlin的运算符都是靠着特定名称的方法支撑的,因此只要重载这些名称的方法,就可以为任意类型添加这些运算符。
重载运算符的方法需要用operato修饰符进行标记。
一、重载单目前缀运算符
为任意类定义名为unaryPlus()、unaryMinus()、not(),且以operator修饰的方法,程序即可对该类的实例使用+、-、!单目前缀运算符。
data class Data(val x: Int, val y: Int) {
//为Data类定义一个unaryMinus()方法
operator fun unaryMinus():Data{
return Data(-x,-y)
}
}
//以扩展方法的形式为Data类定义not()方法
operator fun Data.not(): Data {
return Data(-x, -y)
}
fun main(args: Array<String>) {
val d = Data(4, 10)
println(-d)
println(!d)
}
输出结果:
Data(x=-4, y=-10)
Data(x=-4, y=-10)
二、重载自加和自减运算符
为任意类定义名为inc()、dec(),且以operator修饰
的方法,即可对该类的实例使用++、--运算符。
data class Data(val x: Int, val y: Int) {
//为Data类定义一个inc()方法
operator fun inc(): Data {
return Data(x + 1, y + 1)
}
}
//以扩展方法的形式为Data类定义dec()方法
operator fun Data.dec(): Data {
return Data(x-1, y-1)
}
fun main(args: Array<String>) {
var d = Data(4, 10)
println(d++)
println(d)
var d2=Data(10,20)
println(--d2)
println(d2)
}
输出结果:
Data(x=4, y=10)
Data(x=5, y=11)
Data(x=9, y=19)
Data(x=9, y=19)
三、重载双目算术运算符
为任意类定义名为plus()、minus()、times()、div()、rem()、rangeTo(),且以operator修饰的方法,程序即可对该类的实例使用+、-、*、/、%等运算。
data class Data(val x: Int, val y: Int) {
//为Data类定义一个minus()方法
operator fun minus(target:Data): Double {
return Math.hypot((this.x-target.x).toDouble(),(this.y-target.y).toDouble())
}
}
//以扩展方法的形式为Data类定义dec()方法
operator fun Data.times(target: Data): Int {
return Math.abs(this.x - target.x) * Math.abs(this.y - target.y)
}
fun main(args: Array<String>) {
var d = Data(4, 10)
var d2 = Data(10, 20)
println("d与d2的距离为:${d - d2}")
println("d与d2围城的矩形面积为:${d * d2}")
}
输出结果:
d与d2的距离为:11.661903789690601
d与d2围城的矩形面积为:60