重拾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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java型別轉換與強制型別轉換(轉)Java型別
- 日期型別與String型別的轉換型別
- 程式碼靜態掃描規則——型別轉換檢查型別
- 型別檢查型別
- dataguard型別轉換與模式轉化型別模式
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 《從零開始學Swift》學習筆記(Day48)——型別檢查與轉換Swift筆記型別
- PHP 型別轉換&&型別強制轉換PHP型別
- React 快速上手 – 10 型別檢查 PropTypesReact型別
- React 快速上手 - 10 型別檢查 PropTypesReact型別
- 造型與強制型別轉換型別
- 字串與日期型別轉換的工具類字串型別
- JavaScript 中的型別檢查JavaScript型別
- C++中的向上型別轉換和向下型別轉換C++型別
- 型別轉換型別
- python之 資料型別判定與型別轉換Python資料型別
- interface{} 型別的轉換型別
- 資料型別,型別轉換資料型別
- java 基礎型別與byte[]的轉換Java型別
- Java中基本型別Array與複合型別List的互相轉換Java型別
- Python 型別檢查Python型別
- javascript快速入門8--值,型別與型別轉換JavaScript型別
- React的靜態型別檢查React型別
- Python中的型別檢查Python型別
- C的動態型別檢查型別
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- js型別轉換JS型別
- 字元型別轉換字元型別
- 3.2 型別轉換型別
- JavaScript 型別轉換JavaScript型別
- Golang型別轉換Golang型別
- oracle中date資料型別與timestamp資料型別的轉換Oracle資料型別
- 資料型別的轉換資料型別
- python 與 Mysql 資料型別轉換PythonMySQL 資料型別
- 【python】str與json型別轉換PythonJSON型別
- 13-where與order by以及型別轉換型別
- MySQL與oracle的資料型別轉換總結MySqlOracle資料型別
- React手稿之型別檢查React型別