# 1. 前言
所謂擴展函數也就是在原本類的基礎上增加一些新的方法。我們知道在`Java`中`String`等類定義為`final`也就是不允許修改和繼承,那么如果我們期望對這些類新增一些方法的時候,在`Java`中無法做到,而在`Kotlin`中卻提供了**擴展**來實現。也就是說,在`Kotlin`的擴展不僅可以用于自定義類,也可用于`String`等其它類。
而這種方式其實在`Kotlin`語言基礎中也使用過,類似于`JavaScript`中的原型。
# 2. 使用
## 2.1 簡單擴展函數
比如下面的兩個簡單的案例:
~~~
fun String.doSomething(count: Int = 1): String{
return this.repeat(count)
}
fun Any.showInfo(): Any{
println(this)
return this;
}
fun main() {
"abc".showInfo()
"abc".doSomething(2).showInfo()
}
~~~
結果:
```
abc
abcabc
```
## 2.2 泛型擴展函數
但是,當我們使用:
~~~
"abc".showInfo().doSomething(2).showInfo()
~~~
卻不支持,因為`showInfo`函數返回的是`Any`類型,而`doSomething`針對的是字符串類型,前面的`Any`類型并不能保證就一定是字符串類型。所以這里可以使用泛型來解決這個問題。比如下面的修改:
~~~
fun String.doSomething(count: Int = 1): String{
return this.repeat(count)
}
fun <T> T.showInfo(): T{
println(this)
return this;
}
fun main() {
"abc".showInfo().doSomething(2).showInfo()
}
~~~
結果和上面的保持一致。這類擴展函數叫做**泛型擴展函數**,通常具有更加廣闊的使用空間。且在`Kotlin`的標準庫函數中,廣泛使用了這類函數,比如`let`函數:
~~~
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
~~~
## 2.3 可空擴展函數
這里還是繼續對前面定義的函數進行可空的擴展,這里設置一個默認的打印值:
~~~
fun <T> T?.showInfo(default: String = "對象為空"): T?{
println(this ?: default)
return this;
}
~~~
結果:
```
對象為空
```
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room