重拾Kotlin(10)-型別的檢查與轉換

yesye發表於2021-09-09

圖片描述

一、型別的檢查與轉換

1.1、型別檢查

is 與 !is 運算子用於在執行時檢查物件是否符合給定型別:

fun main(args: Array<String>) {
    val strValue = "leavesC"
    parserType(strValue) //value is String , length : 7
    val intValue = 100
    parserType(intValue) //value is Int , toLong : 100
    val doubleValue = 100.22
    parserType(doubleValue) //value !is Long
    val longValue = 200L
    parserType(longValue) //unknown
}

fun parserType(value: Any) {
    when (value) {
        is String -> println("value is String , length : ${value.length}")
        is Int -> println("value is Int , toLong : ${value.toLong()}")
        !is Long -> println("value !is Long")
        else -> println("unknown")
    }
}

1.2、智慧轉換

在許多情況下,不需要在 Kotlin 中使用顯式轉換運算子,因為編譯器跟蹤不可變值的 is 檢查以及顯式轉換,並在需要時自動插入安全的轉換

例如,對於以下例子來說,當判斷 value 為 String 型別透過時,就可以直接將 value 當做 String 型別變數並呼叫其內部屬性

fun main(args: Array<String>) {
    val strValue = "leavesC"
    parserType(strValue) //value is String , length : 7

    val intValue = 100
    parserType(intValue) //value is Int , toLong : 100

    val doubleValue = 100.22
    parserType(doubleValue) //value !is Long

    val longValue = 200L
    parserType(longValue) //unknown
}

fun parserType(value: Any) {
    when (value) {
        is String -> println("value is String , length : ${value.length}")
        is Int -> println("value is Int , toLong : ${value.toLong()}")
        !is Long -> println("value !is Long")
        else -> println("unknown")
    }
}

編譯器會指定根據上下文環境,將變數智慧轉換為合適的型別

    if (value !is String) return
    //如果 value 非 String 型別時直接被 return 了,所以此處可以直接訪問其 length 屬性
    println(value.length)

    // || 右側的 value 被自動隱式轉換為字串,所以可以直接訪問其 length 屬性
    if (value !is String || value.length > 0) {

    }

    // && 右側的 value 被自動隱式轉換為字串,所以可以直接訪問其 length 屬性
    if (value is String && value.length > 0) {

    }

1.3、不安全的轉換運算子

如果轉換是不可能的,轉換運算子 as 會丟擲一個異常。因此,我們稱之為不安全的轉換運算子

fun main(args: Array<String>) {
    parserType("leavesC") //value is String , length is 7
    parserType(10) //會丟擲異常 ClassCastException
}

fun parserType(value: Any) {
    val tempValue = value as String
    println("value is String , length is ${tempValue.length}")
}

需要注意的是,null 不能轉換為 String 變數,因為該型別不是可空的

因此如下轉換會丟擲異常

    val x = null
    val y: String = x as String //會丟擲異常 TypeCastException

為了匹配安全,可以轉換的型別宣告為可空型別

    val x = null
    val y: String? = x as String?

1.4、安全的轉換運算子

可以使用安全轉換運算子 as? 來避免在轉換時丟擲異常,它在失敗時返回 null

    val x = null
    val y: String? = x as? String

儘管以上例子 as? 的右邊是一個非空型別的 String,但是其轉換的結果是可空的

重拾 Kotlin 系列文章目錄:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2822959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章