📅  最后修改于: 2021-01-05 07:37:53             🧑  作者: Mango
有时无法转换变量,并且抛出异常,这称为不安全转换。不安全的转换由infix运算符as执行。
无法将可为空的字符串(String?)强制转换为非nullabe字符串(String),这将引发异常。
fun main(args: Array){
val obj: Any? = null
val str: String = obj as String
println(str)
}
上面的程序抛出异常:
Exception in thread "main" kotlin.TypeCastException: null cannot be cast to non-null type kotlin.String
at TestKt.main(Test.kt:3)
在尝试将Any类型的整数值转换为字符串类型时,会生成ClassCastException。
val obj: Any = 123
val str: String = obj as String
// Throws java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
源变量和目标变量需要为null才能强制转换才能正常工作:
fun main(args: Array){
val obj: String? = "String unsafe cast"
val str: String? = obj as String? // Works
println(str)
}
输出:
String unsafe cast
科特林提供了一个安全的投<运算符?安全地转换为类型。如果无法强制转换,则返回null,而不是引发ClassCastException异常。
让我们看一个示例,尝试将程序员最初不知道的任何类型的字符串值都转换为可空字符串和可空int。如果可能,它将强制转换值,或者即使无法转换也将返回null而不是引发异常。
fun main(args: Array){
val location: Any = "Kotlin"
val safeString: String? = location as? String
val safeInt: Int? = location as? Int
println(safeString)
println(safeInt)
}
输出:
Kotlin
null