重拾Kotlin(10)-型別的檢查與轉換
一、型別的檢查與轉換
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kotlin 資料型別詳解:數字、字元、布林值與型別轉換指南Kotlin資料型別字元
- 程式碼靜態掃描規則——型別轉換檢查型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 造型與強制型別轉換型別
- 【python】str與json型別轉換PythonJSON型別
- React 快速上手 – 10 型別檢查 PropTypesReact型別
- React 快速上手 - 10 型別檢查 PropTypesReact型別
- java 基礎型別與byte[]的轉換Java型別
- 型別轉換型別
- golang的型別轉換Golang型別
- interface{} 型別的轉換型別
- python 與 Mysql 資料型別轉換PythonMySQL 資料型別
- 資料型別,型別轉換資料型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別
- js型別轉換JS型別
- mysql bigint型別和datetime型別的轉換MySql型別
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- java中的型別轉換Java型別
- CString與LPCWSTR、LPSTR、char*、LPWSTR等型別的轉換型別
- React的靜態型別檢查React型別
- Kotlin可空型別與非空型別以及`lateinit` 的作用Kotlin型別
- 【型別轉換】使用c#實現簡易的型別轉換(Emit,Expression,反射)型別C#MITExpress反射
- Java資料型別及型別轉換Java資料型別
- C# 型別轉換C#型別
- 型別轉換運算子型別
- 型別轉換工具類型別
- c++ 型別轉換C++型別
- 型別轉換注意點型別
- 變數型別轉換變數型別
- go interface{}型別轉換Go型別
- 強制型別轉換型別
- JNI常用型別轉換型別
- Spring型別轉換(Converter)Spring型別
- 資料型別轉換資料型別
- 容器,型別轉換。List。型別
- 說說JavaScript的型別轉換JavaScript型別
- JS資料型別的轉換JS資料型別