参考自官网介绍:http://kotlinlang.org/docs/reference/extensions.html
1. Visibility Modifiers 可见性修饰符
可见性修饰符有四种:private
, protected
, internal
and public,默认是public
可以用于修饰类、伴生对象object、接口、构造函数、一般函数、属性和其setter方法,getter方法和其属性可见性一致。
internal
修饰的,是module内可见,对应于Android Studio中的一个module。
protected
不能同于顶级声明,即直接在一个package中声明,其声明的可对于子类可见。
⚠️
注意:局部变量,局部方法,局部类(?什么叫Local classes)不能有Visibility Modifiers
2. 扩展函数
类似于C#,扩展函数可以在不继承一个类,以及不使用任何设计模式(如装饰者模式)的的前提下,扩展一个类的功能。在函数名前加一个接受者类型,和一个点 ,例如为MutableList类扩展一个swap方法
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
其中,this表示接收者的类型,现在可以如下调用
val l = mutableListOf(1, 2, 3)
l.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'l'
通过使用范型,可以在改变后,用于所有类型,如下:
fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
通过在函数名称前添加范型类型T,可以在接受者类型中使用该范型T
当类已经有一个和扩展函数同名的函数时,在调用该函数时,会调用成员函数的方法,参数列表不一致时除外。
3. 扩展属性
和扩展函数一样,Kotlin支持扩展属性,以简化代码的编写。
val <T> List<T>.lastIndex: Int
get() = size - 1
⚠️
注意:只能通过提供getters/setters的方式来定义扩展属性。
val Foo.bar = 1 // error: initializers are not allowed for extension properties