# 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