在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Kotlin類(lèi)型的檢查與轉(zhuǎn)換
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫(xiě)Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見(jiàn)性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語(yǔ)法
使用Kotlin進(jìn)行服務(wù)器端開(kāi)發(fā)
Kotlin接口
Kotlin反射
Kotlin類(lèi)型別名
Kotlin枚舉類(lèi)
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類(lèi)型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類(lèi)型安全的構(gòu)建器
Kotlin相比Java語(yǔ)言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語(yǔ)法
Kotlin與OSGi
Kotlin數(shù)據(jù)類(lèi)型
Kotlin是面向?qū)ο筮€是函數(shù)式語(yǔ)言?
Kotlin動(dòng)態(tài)類(lèi)型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類(lèi)
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類(lèi)
Kotlin控制流程
Kotlin和Java語(yǔ)言比較
Kotlin 與 Java 語(yǔ)言兼容嗎?
Kotlin教程
Kotlin類(lèi)和繼承
Kotlin對(duì)象表達(dá)式和對(duì)象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類(lèi)
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開(kāi)發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開(kāi)發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin類(lèi)型的檢查與轉(zhuǎn)換

is!is 操作符

我們可以在運(yùn)行時(shí)通過(guò)使用 is 操作符或其否定形式 !is 來(lái)檢查對(duì)象是否符合給定類(lèi)型:

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

if (obj !is String) { // 與 !(obj is String) 相同
    print("Not a String")
}
else {
    print(obj.length)
}

智能轉(zhuǎn)換

在許多情況下,不需要在 Kotlin 中使用顯式轉(zhuǎn)換操作符,因?yàn)榫幾g器跟蹤
不可變值的 is-檢查,并在需要時(shí)自動(dòng)插入(安全的)轉(zhuǎn)換:

fun demo(x: Any) {
    if (x is String) {
        print(x.length) // x 自動(dòng)轉(zhuǎn)換為字符串
    }
}

編譯器足夠聰明,能夠知道如果反向檢查導(dǎo)致返回那么該轉(zhuǎn)換是安全的:

    if (x !is String) return
    print(x.length) // x 自動(dòng)轉(zhuǎn)換為字符串

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

    // `||` 右側(cè)的 x 自動(dòng)轉(zhuǎn)換為字符串
    if (x !is String || x.length == 0) return

    // `&&` 右側(cè)的 x 自動(dòng)轉(zhuǎn)換為字符串
    if (x is String && x.length > 0) {
        print(x.length) // x 自動(dòng)轉(zhuǎn)換為字符串
    }

這些 智能轉(zhuǎn)換 用于 when{: .keyword }-表達(dá)式
while{: .keyword }-循環(huán) 也一樣:

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

請(qǐng)注意,當(dāng)編譯器不能保證變量在檢查和使用之間不可改變時(shí),智能轉(zhuǎn)換不能用。
更具體地,智能轉(zhuǎn)換能否適用根據(jù)以下規(guī)則:

  • val{: .keyword } 局部變量——總是可以;
  • val{: .keyword } 屬性——如果屬性是 private 或 internal,或者該檢查在聲明屬性的同一模塊中執(zhí)行。智能轉(zhuǎn)換不適用于 open 的屬性或者具有自定義 getter 的屬性;
  • var{: .keyword } 局部變量——如果變量在檢查和使用之間沒(méi)有修改、并且沒(méi)有在會(huì)修改它的 lambda 中捕獲;
  • var{: .keyword } 屬性——決不可能(因?yàn)樵撟兞靠梢噪S時(shí)被其他代碼修改)。

“不安全的”轉(zhuǎn)換操作符

通常,如果轉(zhuǎn)換是不可能的,轉(zhuǎn)換操作符會(huì)拋出一個(gè)異常。因此,我們稱(chēng)之為不安全的
Kotlin 中的不安全轉(zhuǎn)換由中綴操作符 as{: .keyword }(參見(jiàn)operator precedence)完成:

val x: String = y as String

請(qǐng)注意,null{: .keyword } 不能轉(zhuǎn)換為 String 因該類(lèi)型不是可空的
即如果 y 為空,上面的代碼會(huì)拋出一個(gè)異常。
為了匹配 Java 轉(zhuǎn)換語(yǔ)義,我們必須在轉(zhuǎn)換右邊有可空類(lèi)型,就像:

val x: String? = y as String?

“安全的”(可空)轉(zhuǎn)換操作符

為了避免拋出異常,可以使用安全轉(zhuǎn)換操作符 as?{: .keyword },它可以在失敗時(shí)返回 null{: .keyword }:

val x: String? = y as? String

請(qǐng)注意,盡管事實(shí)上 as?{: .keyword } 的右邊是一個(gè)非空類(lèi)型的 String,但是其轉(zhuǎn)換的結(jié)果是可空的。