有时无法强制转换变量并引发异常,这称为不安全强制转换。不安全的强制转换由infix运算符as进行。
无法将可为空的字符串(String?)强制转换为非nullabe字符串(String),这将引发异常。
fun main(args: Array<String>){ 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<String>){ val obj: String? = "String unsafe cast" val str: String? = obj as String?//Works println(str) }
输出:
String unsafe cast
Kotlin提供了一个安全转换 as? 安全地转换为类型。如果无法强制转换,则返回null,而不是引发ClassCastException异常。
让无涯教程看一个示例,尝试将程序员最初不知道的任何类型的字符串值都转换为可空字符串和可空int。如果可能,则强制转换值;如果无法转换,则返回null而不是引发异常。
fun main(args: Array<String>){ val location: Any = "Kotlin" val safeString: String? = location as? String val safeInt: Int? = location as? Int println(safeString) println(safeInt) }
输出:
Kotlin null
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)