6.1 可空性
可空性:Kotlin系統(tǒng)中避免NullPointerException錯(cuò)誤的特性
- 可空類型
如果你允許調(diào)用方法時(shí)傳給它所有可能的實(shí)參 ,包括哪些可以為null的實(shí)參,需要顯式地在類型名稱后面加上文號來標(biāo)記。
fun strLenSafe(s:String?) = ···
//問號可以加在任何類型的后面來表示這個(gè)變量可以存儲null引用
沒有問號的類型標(biāo)識這種類型的變量不能存儲null引用。所有常見類型默認(rèn)都是非空的,除非顯式地標(biāo)記為可空
一旦標(biāo)記為可空,則能對該變量進(jìn)行的操作也會受到限制
類型的含義
類型就是數(shù)據(jù)的分類,決定了該類型可能的值,以及該類型的值上可以完成的操作安全調(diào)用運(yùn)算符:‘?.’
允許把一次null檢查和一次方法調(diào)用合并成一個(gè)操作
調(diào)用null值的方法,調(diào)用不會發(fā)生,表達(dá)式的值為null
也可以調(diào)用屬性Elvis運(yùn)算符:‘?:’
fun foo(s: String?){
val t :String = s ?: ""
}
Elvis運(yùn)算符接收兩個(gè)參數(shù),如果第一個(gè)運(yùn)算數(shù)不為null,運(yùn)算結(jié)果就是第一個(gè)運(yùn)算數(shù),否則為第二個(gè)運(yùn)算數(shù)
安全轉(zhuǎn)換運(yùn)算符:‘a(chǎn)s?’
安全轉(zhuǎn)換運(yùn)算符嘗試把值轉(zhuǎn)換成給定的類型,如果類型不合適就返回null非空斷言:‘!!’
fun ignoreNulls(s: String?){
val sNotNull:String = s!!
}
//如果s為null,則拋出NullPointerException,否則表達(dá)式返回s
- ‘let’函數(shù)
‘let’函數(shù)做的事情就是把一個(gè)調(diào)用它的對象編程Lambda表達(dá)式的參數(shù)。
foo?.let{
print(it)
}
//foo為null時(shí),Lambda不會被執(zhí)行
- 延遲初始化的屬性
- 可空類型的擴(kuò)展
類型參數(shù)的可空性
Kotlin中所有泛型類和泛型函數(shù)的類型參數(shù)默認(rèn)都是可空的。
要使類型參數(shù)非空,必須要為它指定一個(gè)非空的上界,那樣泛型會拒絕可空值作為實(shí)參可空性和Java
6.2基本數(shù)據(jù)類型和其他基本類型
Kotlin不區(qū)分基本數(shù)據(jù)類型和它們的包裝類型
- 基本數(shù)據(jù)類型:Int、Boolean和其他
- 可空的基本數(shù)據(jù)類型:Int?、Boolean?和其他