本文概述
- 用于智能投射
- 使用!is进行智能投射
例如:
当我们尝试在没有安全类型转换的情况下访问可为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
【Kotlin智能投射】在使用is或!is检查变量时, 编译器会跟踪此信息并将变量内部转换为目标类型。如果is或!is返回true, 则在范围内完成此操作。
用于智能投射
fun main(args: Array<
String>
){
val obj: Any = "The variable obj is automatically cast to a String in this scope"
if(obj is String) {
// No Explicit Casting needed.
println("String length is ${obj.length}")
}
}
输出:
String length is 64
使用!is进行智能投射
fun main(args: Array<
String>
){
val obj: Any = "The variable obj is automatically cast to a String in this scope"
if(obj !is String) {
println("obj is not string")} else
// No Explicit Casting needed.
println("String length is ${obj.length}")
}
输出:
String length is 64
根据以下条件进行智能铸造工作:
val变量始终是局部属性的方面。
如果val属性是私有属性或内部属性, 则在声明该属性的模块中执行检查。
如果在检查和使用之间未修改本地var变量, 则不会在修改它的lambda中捕获该变量。
推荐阅读
- Kotlin字符串
- Kotlin set接口
- Kotlin密封类
- Kotlin return跳转表达式
- Kotlin正则表达式
- Kotlin正则表达式模式
- Kotlin反射
- Kotlin递归函数
- Kotlin运算符