在之前的教學中已經看到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
,則在範圍內完成。
fun main(args: Array<String>){
val obj: Any = "變數obj自動轉換為此範圍內的String"
if(obj is String) {
// No Explicit Casting needed.
println("字串的長度是:${obj.length}")
}
}
執行上面範例程式碼,得到以下結果 -
字串的長度是:21
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
屬性為private
或internal
,則在宣告屬性的同一模組中執行檢查。var
變數,則不會在修改它的lambda
中捕獲。