一、类型的检查与转换
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,但是其转换的结果是可空的