空類型安全問題
判斷值是否為空,如果為空,則直接返回空,否則,返回相應值
fun getName():String?{
return null
}
問號的意思是允許為空
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)換
聲明對象
val parent:Patent=Child()
parent類型是Child的一個實例
if(parent is Child){
printIn(parent.name)
}
安全類型轉(zhuǎn)換加?
val parent:Parent=Parent()
val child:Child?=parent as Child
相當于Java的強轉(zhuǎn)類型。在這里加了問號是可null類型,那么,編譯的時候就會出錯。
解決方法是
val child:Child?=parent as? Child;
意思是如果child為null就返回null,這就避免了出錯。
小結(jié)
1)任意類型都有可空和不可空的兩種
編譯器判斷
->val notNull:String=null (X) 不能為空
->val nullable:Stirng?=null 可以為空
->notNull.length 不為空值可以直接運行
->nullable.length (X)可能為空,不能獲取它的長度
->nullable!!.length 強制認定它不為空
->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<子類的成員>)
編譯器盡可能推到類型,遠離無用的類型轉(zhuǎn)換
if(nullable!=null)nullable.length
這是對的,因為我們知道nullable不為空,它不為空則才能繼續(xù)執(zhí)行代碼塊。