Kotlin智能類型轉換

在之前的教程中已經看到Kotlin可空和非可空類型如何聲明。 要使用可空類型,可以選擇使用智能強制轉換。 智能轉換是Kotlin編譯器跟蹤if表達式內部條件的功能。 如果編譯器發現變量可null類型的null值,則編譯器將允許訪問此變量。

示例

當嘗試在沒有安全轉換的情況下訪問可空類型的String時,它將生成編譯錯誤。

var string: String? = "Hello!"  
print(string.length) // Compile error

要解決上述表達式,使用安全轉換爲:

fun main(args: Array<String>){  
    var string: String? = "Hello!"  
    if(string != null) { // smart cast  
        print(string.length) // It works now!  
    }  
}

執行上面示例代碼,得到以下結果 -

6

當使用is!is來檢查變量時,編譯器會跟蹤此信息並在內部將變量轉換爲目標類型。 如果is!is返回true,則在範圍內完成。

使用is來智能轉換

fun main(args: Array<String>){  
    val obj: Any = "變量obj自動轉換爲此範圍內的String"  
    if(obj is String) {  
        // No Explicit Casting needed.  
        println("字符串的長度是:${obj.length}")  
    }  
}

執行上面示例代碼,得到以下結果 -

字符串的長度是:21

使用!is來智能轉換

fun main(args: Array<String>){
    val obj: Any = "變量obj自動轉換爲此範圍內的String"
    if(obj is String) {
        // No Explicit Casting needed.
        println("obj不是字符串")
    }else{
        println("字符串的長度是:${obj.length}")
    }
}

執行上面示例代碼,得到以下結果 -

字符串的長度是:21

智能轉換工作根據以下條件來執行:

  • val變量始終是局部屬性的方面。
  • 如果val屬性爲privateinternal,則在聲明屬性的同一模塊中執行檢查。
  • 如果在檢查和使用之間未修改局部var變量,則不會在修改它的lambda中捕獲。