空類型安全問題
判斷值是否為空,如果為空,則直接返回空,否則,返回相應(yīng)值
fun getName():String?{
return null
}
問號(hào)的意思是允許為空
fun main(args:Array<String>){
null類型
val name=getName()
println(name?.length)
判斷name是否為空,為空就輸出Null
}
聲明可null類型但本身不為null
val value:String?="heloword"
-->
println(value!!.length)
告訴編譯器,我知道他不為null,編譯器可以繼續(xù)往下走。
或者
if(value!=null)
println(value.length)
智能類型轉(zhuǎn)換
聲明對(duì)象
val parent:Patent=Child()
parent類型是Child的一個(gè)實(shí)例
if(parent is Child){
printIn(parent.name)
}
安全類型轉(zhuǎn)換加?
val parent:Parent=Parent()
val child:Child?=parent as Child
相當(dāng)于Java的強(qiáng)轉(zhuǎn)類型。在這里加了問號(hào)是可null類型,那么,編譯的時(shí)候就會(huì)出錯(cuò)。
解決方法是
val child:Child?=parent as? Child;
意思是如果child為null就返回null,這就避免了出錯(cuò)。
小結(jié)
1)任意類型都有可空和不可空的兩種
編譯器判斷
->val notNull:String=null (X) 不能為空
->val nullable:Stirng?=null 可以為空
->notNull.length 不為空值可以直接運(yùn)行
->nullable.length (X)可能為空,不能獲取它的長度
->nullable!!.length 強(qiáng)制認(rèn)定它不為空
->nullable?.length 若為空,則返回null
智能類型轉(zhuǎn)換
java 類型轉(zhuǎn)換
val sub:SubClass=parent as SubClass
類似Java的類型轉(zhuǎn)換,失敗則拋異常
安全類型轉(zhuǎn)換
val sub:SubClass?=parent as?SubClass
如果轉(zhuǎn)換失敗,返回null,不拋異常。
if(parent is SubClass)parent<子類的成員>)
編譯器盡可能推到類型,遠(yuǎn)離無用的類型轉(zhuǎn)換
if(nullable!=null)nullable.length
這是對(duì)的,因?yàn)槲覀冎纍ullable不為空,它不為空則才能繼續(xù)執(zhí)行代碼塊。