? ? ? ? 舉個例子:如下的兩種 toString() 方法,第一種返回的是 "" 空字符串嗎反肋?
????????事實并非如此踏施,它返回的是 "null"?
圖1 兩種toString()方法
這是為什么呢?
這主要是因為 Kotlin 和 Java 不同畅形,Kotlin增加了空值 ? 。因此棍厌,第一個是 Any? 的 toString() 擴展方法竖席,第二個調(diào)用的是 Any 類的 toString() 成員方法耘纱。
可以看一下 Any?.toString() 如果說明的毕荐,當(dāng)對象為 null 時,返回的時 "null" 而不是 "" (空字符串)
圖2 Any?.toString()
開發(fā)中如果避免或者區(qū)分:
辨認:
通過擴展函數(shù)辨認畸陡。Kotlin 中的 Any 類和類似于 Java 中的 Object 類虽填。因此每一個對象都應(yīng)該有一個成員方法 toString()曹动。那么只要區(qū)分顯示的 toString() 是否是擴展函數(shù)就可以了,圖1 中可以明顯看出黃色斜體為擴展函數(shù)墓陈。
更改:
既然辨認出來了第献,那么如何更改呢兔港?有兩種方法:
第一種:調(diào)用一個可空變量的 toString() 方法時,改用這種方式?
var?a: Int? = null
val str = a?.toString() ?: ""
第二種:更改擴展函數(shù)飒赃,可以重寫 Any?.toString() 方法
fun Any?.toString():String{ return this?.toString() ?: ""}