在之前的教程中已经看到Kotlin可空和非可空类型如何声明。 要使用可空类型,可以选择使用智能强制转换。 智能转换是Kotlin编译器跟踪if
表达式内部条件的功能。 如果编译器发现变量可null
类型的null
值,则编译器将允许访问此变量。
示例
当尝试在没有安全转换的情况下访问可空类型的String
时,它将生成编译错误。
var string: String? = "Hello!" print(string.length) // Compile error
要解决上述表达式,使用安全转换为:
fun main(args: Array<String>){ var string: String? = "Hello!" if(string != null) { // smart cast print(string.length) // It works now! } }
执行上面示例代码,得到以下结果 -
6
当使用is
或!is
来检查变量时,编译器会跟踪此信息并在内部将变量转换为目标类型。 如果is
或!is
返回true
,则在范围内完成。
fun main(args: Array<String>){ val obj: Any = "变量obj自动转换为此范围内的String" if(obj is String) { // No Explicit Casting needed. println("字符串的长度是:${obj.length}") } }
执行上面示例代码,得到以下结果 -
字符串的长度是:21
fun main(args: Array<String>){ val obj: Any = "变量obj自动转换为此范围内的String" if(obj is String) { // No Explicit Casting needed. println("obj不是字符串") }else{ println("字符串的长度是:${obj.length}") } }
执行上面示例代码,得到以下结果 -
字符串的长度是:21
智能转换工作根据以下条件来执行:
val
变量始终是局部属性的方面。val
属性为private
或internal
,则在声明属性的同一模块中执行检查。var
变量,则不会在修改它的lambda
中捕获。