科特林 |显式类型转换
在 Smart Casting 中,我们一般使用is或!is运算符来检查变量的类型,编译器会自动将变量强制类型转换为目标类型,而在显式类型转换中,我们使用as 运算符。
显式类型转换可以使用:
- 不安全的强制转换运算符: as
- 安全运算符: as?
不安全的强制转换运算符:as
手动地,我们使用类型转换运算符as将变量转换为目标类型。
在下面的程序中,字符串类型的变量 str1 使用as运算符转换为目标类型。
Kotlin
fun main(args: Array){
val str1: String = "It works fine"
val str2: String = str1 as String // Works
println(str1)
}
Kotlin
fun main(args: Array){
val str1: Any = 11
val str2: String = str1 as String // throw exception
println(str1)
}
Kotlin
fun main(args: Array){
val str1: String? = null
val str2: String = str1 as String // throw exception
println(str1)
}
Kotlin
fun main(args: Array){
val str1: String? = null
val str2: String? = str1 as String? // throw exception
println(str1)
}
Kotlin
fun main(args: Array){
var str1: Any = "Safe casting"
val str2: String? = str1 as? String // it works
str1 = 11
// type casting not possible so returns null to str3
val str3: String? = str1 as? String
val str4: Int? = str1 as? Int // it works
println(str2)
println(str3)
println(str4)
}
输出:
It works fine
我们可能无法将变量强制转换为目标类型,并且它在运行时抛出异常,这就是为什么它被称为不安全强制转换。
当使用 Integer 类型转换为 String 类型时,会抛出 ClassCastException。
科特林
fun main(args: Array){
val str1: Any = 11
val str2: String = str1 as String // throw exception
println(str1)
}
输出:
Exception in thread “main” java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
我们不能将可空字符串转换为不可空字符串,它会抛出异常 TypeCastException。
科特林
fun main(args: Array){
val str1: String? = null
val str2: String = str1 as String // throw exception
println(str1)
}
输出:
Exception in thread “main” kotlin.TypeCastException: null cannot be cast to non-null type kotlin.String
因此,我们必须将目标类型也用作可空字符串,以便类型转换不会引发异常。
科特林
fun main(args: Array){
val str1: String? = null
val str2: String? = str1 as String? // throw exception
println(str1)
}
输出:
null
安全运算符:as?
Kotlin 还提供了一种使用安全转换运算符as? .如果无法进行强制转换,则返回null而不是抛出 ClassCastException 异常。
这是一个示例,其中我们尝试将程序员最初知道的任何类型的字符串值转换为可为空的字符串,然后它可以正常工作。当我们用整数值初始化Any并尝试转换为可为空的字符串时,这种类型转换是不可能的,并将null返回给 str3。
科特林
fun main(args: Array){
var str1: Any = "Safe casting"
val str2: String? = str1 as? String // it works
str1 = 11
// type casting not possible so returns null to str3
val str3: String? = str1 as? String
val str4: Int? = str1 as? Int // it works
println(str2)
println(str3)
println(str4)
}
输出:
Safe casting
null
11