Kotlin是Java最好的第三方库
我们在使用kotlin进行开发的时候,会发现其简化了很多代码细节,使编写代码更加简洁,同时也封装了更多的内在逻辑,如果读者是从java开发转而为kotliin的使用者,那么会发现其实kotlin简介语法的实现底层都是封装的java相关细节,本文尝试从kotlin的使用入手,解读kotlin中类型相关的实现细节
kotlin中的类型系统
kotlin相对于Java来说,是更纯的面向对象的语言,在Java中除了对象外,还存在int等基本类型,而kotlin中是没有基本类型的。其类型系统如上图,Any为所有非空类型的根类型, 翻译为java来说就是object类型,而Any?是Any和空的并集,可以理解为是所有类型的根类型。
kottlin中都是基于对象的,那么使用kotlin就不能使用Java中的基本类型了吗?实际上不是的,kotlin中确实只定义了引用类型,但是当我们使用基本类型的包装类是,kotlin会做一些优化,比如:
val x : Int = 18
这种情况下,反编译代码你会发现,其字节码中实际使用的类型是基本类型int,而不是使用包装类型
val x : Int ?= 18
这种情况下,反编译代码你会发现其使用的类型是Integer包装类型,那么以此类推,kotlin中是否也会对其他基本类型这样处理呢?大家可以去试试
? 是如何实现空安全的
使用kotlin后,对于那些可能存在空引用的情况,我们一般都是使用?来避免NullPointException,那么kotlin中的空安全是如何实现的呢?
data class Seat(val student: Student?) // 座位
data class Student(val glasses: Glasses?) //学生
data class Glasses(val degreeOfMyopia: Double) //眼镜度数
现在我们想知道一个座位上学生的度数是多少?
fun getDegreeIfMyopiaKt(seat: Seat?):Double{
return seat?.student?.glasses?.degreeOfMyopia ?: 0.0
}
反编译查看对应的Java代码:
public final double getDegreeIfMyopiaKt(@Nullable Seat seat){
double var3;
if (seat != null) {
Student var1000 = seat.getStudent();
if (var1000 != null) {
Glasses var2 = var1000.getGlasses();
if (var2 != null) {
var3 = var2.getDegreeOfMyopia();
return var3;
}
}
}
var3 = 0.0;
return var3;
}
可以发现kotlin中?实际上是通过编译时自动加人@Nullable注解和if else判空来实现空安全的,这样做可以和Java完美地相互转换,而且性能最优。
koltin是如何自动类型转换的
在使用Java时我们判断类型时,常常使用instanceof关键字来处理,当使用Kotlin时,会使用is关键字类处理,那么kotlin是如何实现的呢?
val stu: Any = Student(Glasses(189.00))
if (stu is Student) {
println(stu.glasses)
}
反编译成java对应的代码如下:
Student stu = new Student(new Glasses(189.00));
if (stu instanceof Student){
Glasses var2 = ((Student)stu).getGlasses();
System.out.println(var2);
}
可以发现其kotlin中is实际上是通过java的instanceof关键字和强制类型转换类实现的