Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva

时间:Mar 21, 2017

原文链接:https://antonioleiva.com/operator-overload-kotlin/

 

就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作。

 

最典型的是加(+),减(-),乘(*),除(/),而且还有很多。

 

类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符。

 

还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我们就可创造能用于任何数据类型操作符。

 

Kotlin的这种方案:有一些预定义的操作符,而我们能够为任意数据类型重载它们

 

Kotlin的操作符重载

 

如我们讨论的,Kotlin能够重载一些操作符,在我们的类中实现其相应的函数。这些函数前必须加上保留字operator

 

这些基本操作符如下:

 

一元操作符

 

+a

a.unaryPlus()

-a

a.unaryMinus()

!a

a.not()

a++

a.inc()

a–

a.dec()

 

二元操作符

 

a + b

a.plus(b)

a – b

a.minus(b)

a * b

a.times(b)

a / b

a.div(b)

a % b

a.mod(b)

a..b

a.rangeTo(b)

a in b

b.contains(a)

a !in b

!b.contains(a)

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)

 

数组类型操作符

 

a[i]

a.get(i)

a[i, j]

a.get(i, j)

a[i_1, …, i_n]

a.get(i_1, …, i_n)

a[i] = b

a.set(i, b)

a[i, j] = b

a.set(i, j, b)

a[i_1, …, i_n] = b

a.set(i_1, …, i_n, b)

 

等式(equals)操作符

 

a == b

a?.equals(b) ?: b === null

a != b

!(a?.equals(b) ?: b === null)

 

 

由于equals操作使用更复杂地转换做正确性检查,并且期望函数准确说明而不仅仅是为它的一个特殊名称,而稍有一点不同略有不同。

1 fun equals(other: Any?): Boolean

 

激活(invoking)函数

 

a(i)

a.invoke(i)

a(i, j)

a.invoke(i, j)

a(i_1, …, i_n)

a.invoke(i_1, …, i_n)

 

例子

 

假设你有公司数据模型,每位雇员的列表。

 

 

你可以使用get操作符访问方括号中位置。这种实现非常容易:

1 class Employee(val id: Long, val name: String)
2  
3 class Company(private val employees: List) {
4     operator fun get(pos: Int) = employees[pos]
5 }

 

 

这样你就可以使用它:

1 val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike")))
2 val mike = company[1]

 

 

而你也是能够超于它,并用ID来恢复值,实现这样的功能:

1 operator fun get(id: Long) = employees.first { it.id == id }
2  
3 val mike = company[2584]

 

结论

 

操作符能够帮助我们为使用通用符号表达已知操作提升可读性。

 

 

小心不要在会导致读者混淆的情况下使用它们,它们能够成为一个非常有趣的工具

 

 

如果您还不知道怎样做,我建议你获取免费指南,学习怎样创建您的第一个项目,或是直接获取这本,学习怎样从零开始创建一个完整的应用程序。

 

 

 

a.unaryMinus()

posted @ 2017-03-25 21:39  figozhg  阅读(1358)  评论(0编辑  收藏  举报