例子
Java中的类型转换
//Java
public class Main {
public static void main(String[] args) {
Person bob = new Chinese("Bob");
if (bob instanceof Chinese) {
System.out.println(((Chinese)bob).name);//重点
}
}
}
interface Person {}
class Chinese implements Person {
public String name;
public Chinese(String name) {
this.name = name;
}
}
Kotlin中的智能类型转换
interface Person
class Chinese(var name: String) : Person
fun main() {
var bob: Person = Chinese("Bob")
if (bob is Chinese) {
println(bob.name)//重点
}
}
如下图
对象bob已经经过了类型判断,再进行强制类型转换是多余的。在这样的情形下,Kotlin编译器将为我们进行智能类型转换。
再例
Kotlin空类型智能类型转换
//Kotlin
fun main() {
val hello: String? = "Hello"
if (hello != null) {
println(hello.length)
}
}
判断有效的大括号范围内,hello被只能转换成String,在大括号外,hello仍是String?类型。
不支持智能类型转换的情形
IDE告诉我们,此情形下的hello变量是一个全局变量,可能被main线程之外的线程访问修改,因此,即使已经有了hello != null的判断,也不能保证hello在被使用时是非空的String类型。因此,无法进行智能类型转换。
安全类型转换
Kotlin使用关键字as对类的对象进行强制类型转换,但是,转换可能并不能成功。基于此,Kotlin推出了安全类型转换。
bob as Chinese ---> bob as? Chinese
使用as?关键字,如转换不成功,语句将返回null。
类型转换的建议
- 尽可能使用val来声明不可变引用,让程序的含义更加清晰确定;
- 尽可能减少函数对外部变量的访问,也为函数式编程提供基础;
- 必要时创建局部变量指向外部变量,避免因它变化引起程序错误。