举个例子:如下的两种 toString() 方法,第一种返回的是 "" 空字符串吗?
事实并非如此,它返回的是 "null"
图1 两种toString()方法
这是为什么呢?
这主要是因为 Kotlin 和 Java 不同,Kotlin增加了空值 ? 。因此,第一个是 Any? 的 toString() 扩展方法,第二个调用的是 Any 类的 toString() 成员方法。
可以看一下 Any?.toString() 如果说明的,当对象为 null 时,返回的时 "null" 而不是 "" (空字符串)
图2 Any?.toString()
开发中如果避免或者区分:
辨认:
通过扩展函数辨认。Kotlin 中的 Any 类和类似于 Java 中的 Object 类。因此每一个对象都应该有一个成员方法 toString()。那么只要区分显示的 toString() 是否是扩展函数就可以了,图1 中可以明显看出黄色斜体为扩展函数。
更改:
既然辨认出来了,那么如何更改呢?有两种方法:
第一种:调用一个可空变量的 toString() 方法时,改用这种方式
var a: Int? = null
val str = a?.toString() ?: ""
第二种:更改扩展函数,可以重写 Any?.toString() 方法
fun Any?.toString():String{ return this?.toString() ?: ""}