在kotlin中经常看到这样的if语句:
//s是一个String类型的对象
if(s.isNullOrEmpty()){
//执行空对象或空字符串的逻辑
}
笔者不禁想问,如果s是空对象,调用它的函数不会抛出空指针吗?
它是如何检查被调用的对象s是空对象的呢?
查阅资料后,发现原来这是kotlin的扩展函数的特性:
被扩展的类后面添加?.
再接扩展函数名即表示可以在空对象上扩展。在扩展函数内, 可以通过 this 来判断接收者是否为 NULL,这样,即使接收者为 NULL,也可以调用扩展函数。例如:
fun Any?.toString(): String {
if (this == null) return "null"
// 空检测之后,“this”会自动转换为非空类型,所以下面的 toString()
// 解析为 Any 类的成员函数
return toString()
}
fun main(arg:Array<String>){
var t = null
println(t.toString())
}
看一下isNulOrEmpty函数的实现:
@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
contract {
returns(false) implies (this@isNullOrEmpty != null)
}
return this == null || this.length == 0
}
可以看到,当被调用对象是NULL时它返回true。并且返回类型Boolean是一个非空对象,所以isNullOrEmpty函数无论如何要么返回true要么返回false不可能是NULL。