当前位置: 移动技术网 > IT编程>开发语言>Java > Kotlin基本类型自动装箱出现问题解决办法

Kotlin基本类型自动装箱出现问题解决办法

2019年07月19日  | 移动技术网IT编程  | 我要评论
kotlin基本类型自动装箱出现问题解决办法 问题 在kotlin官方文档介绍基本类型时,给我们说明了在有些情况下会对基本类型自动进行装箱操作。 但是具体是如何进行装箱

kotlin基本类型自动装箱出现问题解决办法

问题

在kotlin官方文档介绍基本类型时,给我们说明了在有些情况下会对基本类型自动进行装箱操作。 但是具体是如何进行装箱,以及何时进行装箱缺没有提供详细介绍。只是提供了一个例子,如下:

val a: int = 10000
print(a === a) // prints 'true'
val boxeda: int? = a
val anotherboxeda: int? = a
print(boxeda === anotherboxeda) // !!!prints 'false'!!!

对于上述代码,废了好大力气 写了好多demo才搞清楚。 接下来先通过几个简单的栗子来理解一下kotlin是如何进行装箱操作的

####**第一个栗子**

fun main(args: array<string>) {
 test1()
}

fun test1() {
 val i: int = 1000
 println(i)
}

给大家提供一点技巧,在看不懂kotlin是如何编译运行的情况下,我们可以先将其反编译成java字节码,对于java我们就驾轻就熟啦。具体做法就是 1 显示kotlin的字节码 ![这里写图片描述]() 2 将kotlin字节码反编译成java字节码 ![这里写图片描述]() 通过这种方法,将上面的test1()方法反编译之后得出如下字节码

public static final void test1() {
  short i = 1000;
  system.out.println(i);
 }

可以看出kotlin编译器将 i 单纯的看做是一个基本类型short,并将其打印

再举个栗子

fun main(args: array<string>) {
 test2()
}

fun test2() {
 val i: int? = 1000
 println(i)
}

看到test1和test2的区别了吗?? 在test2中多了一个 ?

val i: int? = 1000

这个“`?“`代表的意思是这个i可以被赋值为null, 既然可以是null,那就不能是原始类型,只能是对象,因此kotlin会自动的为其进行装箱操作。因此反编译test2之后,我们会得到如下字节码

 public static final void test2() {
  integer i = integer.valueof(1000);
  system.out.println(i);
 }

分析

理解了上述两个小栗子之后,在回头看一下官方提供的demo,就可以理解了。我们不妨自己也写一个类似的代码

fun test3() {
 //kotlin并不会自动装箱
 val i: int = 1000

 println(i)

 //因为j和k都被当做对象操作,因此会将i进行装箱做操,然后复制给j、k
 val j: int? = i
 val k: int? = i

 println(j === k)
}

反编译成java字节码之后结果同我们猜想的一致:

public static final void test3() {
  short i = 1000;
  system.out.println(i);
  integer j = integer.valueof(i);
  integer k = integer.valueof(i);
  boolean var3 = j == k;
  system.out.println(var3);
}

总结

注:在kotlin中,字符类型不是基本数值类型,是一个独立的数据类型。

上面的整形类型的表示方式并没有使用int、double等java中的关键字,而是使用了封装类来表示 这是因为在kotlin中一切都是对象(没有如同java中的基本类型)。 当我们在代码中使用整形数字的时候,kotlin会自动的将其进行装箱操作

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网