25-运算符重载
4.7 运算符重载
运算符重载是C++语言支持的特性,但Java语言中并不支持,很多高级科学运算都会涉及运算符重载。为了方便,Kotlin语言又重新支持此特性。
Kotlin提供了一些固定的操作符,这些预定义运算符的操作对象只能是基本数据类型,实际上,很多自定义的对象也需要有类似的运算操作,这就涉及运算符的重载问题。运算符重载是对已有的运算符赋予多重含义,使得同一个运算符作用于不同类型的数据会导致不同的作用结果。
重载一个运算符时,必须重写它所对应的operator方法。例如,针对加法运算符的定义如下。
public operator fun plus(other: Byte): Float
从上面的定义可以看出,运算符重载的实质就是函数重载。在具体实现上,首先把指定的运算表达式转化为对运算方法的调用,运算对象转化为运算符方法的实参,然后根据实参的类型来确定需要调用的目标函数,之后Kotlin会将对应的符号运算转换到具体的方法之中,这一过程直接由编译器在编译过程中完成。例如,Float类型针对加法运算符的定义如下。
public operator fun plus(other: Byte): Float
public operator fun plus(other: Int): Float
public operator fun plus(other: Short): Float
public operator fun plus(other: Long): Float
public operator fun plus(other: Float): Float
public operator fun plus(other: Double): Float
对于运算符重载来说,操作的表达式不一样,其转换方法也会不一样。根据操作对象的不同,运算符分为一元运算符、二元操作符和位运算操作符。