Kotlin編碼竅門(mén)之類型檢查與類型轉(zhuǎn)換(Type Checks and Casts)

is和!is操作符

我們可以通過(guò)is操作符和!is操作符來(lái)檢查一個(gè)對(duì)象是否是目標(biāo)類型:

if (obj is String) {
    print(obj.length)
}

if (obj !is String) { // same as !(obj is String)
    print("Not a String")
}
else {
    print(obj.length)
}

職能轉(zhuǎn)換(Smart Casts)

許多情況下,Kotlin是不用使用強(qiáng)制類型轉(zhuǎn)換操作的,因?yàn)榫幾g器會(huì)跟蹤不可變值的is檢查操作,并會(huì)在需要的時(shí)候自動(dòng)插入(安全的)類型轉(zhuǎn)換操作:

fun demo(x: Any) {
    if (x is String) {
        print(x.length) // x is automatically cast to String
    }
}

如果否定檢查導(dǎo)致返回,編譯器足夠聰明地知道轉(zhuǎn)換是安全的:

if (x !is String) return
    print(x.length) // x is automatically cast to String

或者在&&||操作符的右側(cè):

    // x is automatically cast to string on the right-hand side of `||`
    if (x !is String || x.length == 0) return

    // x is automatically cast to string on the right-hand side of `&&`
    if (x is String && x.length > 0) {
        print(x.length) // x is automatically cast to String
    }

如此只能的轉(zhuǎn)換也可以用于when表達(dá)式和while循環(huán)中:

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

注意:當(dāng)編譯器不能保證變量在檢查和使用之間不會(huì)發(fā)生改變的時(shí)候,職能轉(zhuǎn)換則是不能用的。也就是說(shuō),智能轉(zhuǎn)換的使用需要依據(jù)以下規(guī)則:

  1. val局部變量,總是可以。
  2. val屬性:若屬性是privateinternal類型的,或者類型檢查是執(zhí)行在屬性聲明的同一模塊中的,則可以使用智能轉(zhuǎn)換。智能轉(zhuǎn)換不能用于open屬性或者具有自定義getter的屬性。
  3. var局部變量:如果變量在檢查和使用之間沒(méi)有修改,且沒(méi)有被毀修改它的λ表達(dá)式捕獲,則可以使用。
  4. var屬性:總是不可以。(因?yàn)樵撟兞康闹悼梢栽谌我鈺r(shí)刻被任意代碼修改)

非安全轉(zhuǎn)換操作("Unsafe" cast operator)

通常,如果一個(gè)轉(zhuǎn)換不能夠完成的話講拋出一個(gè)異常。因此,我們稱之為非安全的。這種非安全的轉(zhuǎn)換在Kotlin中通過(guò)中綴操作符as實(shí)現(xiàn):

val x: String = y as String

注意:null不能被轉(zhuǎn)換為String,因?yàn)樵擃愋褪遣荒転?code>null的。也就是說(shuō),如果變量ynull,則上述代碼將會(huì)拋異常。為了匹配Java轉(zhuǎn)換語(yǔ)義,在轉(zhuǎn)換右邊必須是可null類型:

val x: String? = y as String?

安全轉(zhuǎn)換操作("Safe" (nullable) cast operator)

為了避免異常的拋出,可以使用安全轉(zhuǎn)換操作符as?,當(dāng)轉(zhuǎn)換失敗的時(shí)候,將會(huì)返回null

val x: String? = y as? String

注意:盡管as?右側(cè)是一個(gè)非null類型String,但其轉(zhuǎn)換結(jié)果則可以是null。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容