前言

扩展函数和扩展属性在 Java 里面是没有的,这样的话很好的弥补了 Java 的缺陷。所谓扩展方法或者属性是指在原来没有的方法或者属性上进行扩展,不会改变原来的属性和方法。

扩展函数

声明扩展函数的方法是先写上要扩展的类名,之后在写扩展方法。

对 Book 这个类进行扩展,这个类只有一个方法,在我们不修改 Book 类的前提下对其进行扩展。

class Book(val name: String, var price: Int) {
    val ISBN: Int = 123456789
    fun add() {
        println("Add a book,name is $name,price is $price,ISBN is $ISBN")
    }
}
fun Book.show() = add()

这样我们便完成了对 Book 类进行扩展。

在扩展函数中,可以使用原有类的方法,变量。

fun main(args: Array<String>) {
    val book = Book("红楼梦", 50)
    book.show()
}

扩展是静态解析的
扩展不能真正的修改他们所扩展的类。通过定义一个扩展,你并没有在一个类中插入新成员, 仅仅是可以通过该类型的变量用点表达式去调用这个新函数。

扩展属性

扩展属性不能初始化器,所以只能是使用显示 get/set 方法进行定义。

任就采用上面的例子。给 Book 添加一个 profit 属性。

像这个样子,我们就定义了这个类的扩展属性

val Book.profit: Int
    get() = price - 20
fun main(args: Array<String>) {
    val book = Book("红楼梦", 50)
    book.show()
    println("book's profit is ${book.profit}")
}

更多关于扩展函数/方法的例子可以参考官方网站

kotlin官方文档(中文)

kotlin官方文档(英文)