Kotlin 型別檢查與轉型 (Type Checks and Casts)

Kotlin 的型別系統非常聰明,最著名的特性就是 Smart Casts (智慧轉型)。 這讓你不需要像 Java 那樣寫一堆重複的轉型程式碼。

is!is 運算子

用來檢查一個物件是否屬於某個型別 (相當於 Java 的 instanceof)。

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

if (obj !is String) { // 不是 String
    println("Not a String")
}

Smart Casts (智慧轉型)

當你用 is 檢查過型別後,編譯器會自動把變數當作該型別來處理! 你不需要再寫 (String) obj 這種轉型程式碼。

fun demo(x: Any) {
    if (x is String) {
        // x 自動被轉型成 String,可以直接呼叫 .length
        println(x.length) 
    }
}

邏輯運算中的 Smart Casts

Smart Casts 甚至在 &&|| 的右側也有效:

// 如果 x 不是 String,|| 後面就不會執行,所以右邊 x 一定是 String
if (x !is String || x.length == 0) return

// 如果 x is String 為真,&& 右邊 x 就會被視為 String
if (x is String && x.length > 0) {
    println(x.length)
}

顯式轉型 (Explicit Casts)

如果你確定某個變數是特定型別,可以使用 as 運算子強轉。

Unsafe Cast (as)

如果轉型失敗,會拋出 ClassCastException

val x: Any = "Hello"
val s: String = x as String // OK
val i: Int = x as Int       // Exception!

Safe Cast (as?)

推薦使用!如果轉型失敗,會回傳 null,而不會拋出例外。

val x: Any = "Hello"
val i: Int? = x as? Int // 回傳 null
println(i) // null

總結

  1. 先用 is 檢查。
  2. 享受 Smart Casts 的便利,不用手動轉。
  3. 如果真的要強轉,盡量用 as? 避免崩潰。