kotlin中的类型

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关键字和强制类型转换类实现的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值