kotlin里面的智能类型转换有如下两个场景:
场景一:自动推断类型并转换首先看下示例:
var zhangsan: Zhangsan = Person("zhangsan")
if (zhangsan is Person) {
println(zhangsan as Person).name
}
用is操作符判断下zhangsan这个变量是否是Person类,如果是的话,打印出zhangsan的名字,打印时又将zhangsan强制转化成了Person,因为外面已经判断过zhangsan是Person了,kotlin可以自动在内部将zhangsan转化为Person,而不需要我们再用as操作符强制转换了,因此代码可以写成如下:
var zhangsan: Zhangsan = Person("zhangsan")
if (zhangsan is Person) {
println(zhangsan.name)
}
zhangsan类型自动转化为了Person
场景二:空类型看如下示例:
var value: String? = null
value = "zhangsan"
if (value != null) {
println(value.length)
}
在if时已经判断了value不为空,并且还能确定没有其他地方去修改value这个值,因此在if外面时value的类型是String?,但是在if里面则自动转化为了String类型,而不用再判空调用length,
也就是不用写成value?.length的形式。如下图所示
先看如下示例:
val zhangsan: String = "wangwu"
println((zhangsan as Person).name)
当我们不确定是否能够将A对象转化为B类型时,可以使用as ?的安全操作符,这时zhangsan整体变成了Person?的数据类型,因此在访问Person的属性name时前面也需要添加?修改完成后的代码如下:
val zhangsan: String = "wangwu"
println((zhangsan as? Person)?.name)