Kotlin基本类型自动装箱出现问题解决办法
Kotlin基本类型自动装箱出现问题解决办法
问题
在Kotlin官方文档介绍基本类型时,给我们说明了在有些情况下会对基本类型自动进行装箱操作。但是具体是如何进行装箱,以及何时进行装箱缺没有提供详细介绍。只是提供了一个例子,如下:
vala:Int=10000 print(a===a)//Prints'true' valboxedA:Int?=a valanotherBoxedA:Int?=a print(boxedA===anotherBoxedA)//!!!Prints'false'!!!
对于上述代码,废了好大力气写了好多demo才搞清楚。接下来先通过几个简单的栗子来理解一下Kotlin是如何进行装箱操作的
####**第一个栗子**
funmain(args:Array){ test1() } funtest1(){ vali:Int=1000 println(i) }
给大家提供一点技巧,在看不懂Kotlin是如何编译运行的情况下,我们可以先将其反编译成Java字节码,对于Java我们就驾轻就熟啦。具体做法就是1显示Kotlin的字节码2将Kotlin字节码反编译成Java字节码通过这种方法,将上面的test1()方法反编译之后得出如下字节码
publicstaticfinalvoidtest1(){ shorti=1000; System.out.println(i); }
可以看出Kotlin编译器将i单纯的看做是一个基本类型short,并将其打印
再举个栗子
funmain(args:Array){ test2() } funtest2(){ vali:Int?=1000 println(i) }
看到test1和test2的区别了吗??在test2中多了一个?
vali:Int?=1000
这个“`?“`代表的意思是这个i可以被赋值为null,既然可以是null,那就不能是原始类型,只能是对象,因此Kotlin会自动的为其进行装箱操作。因此反编译test2之后,我们会得到如下字节码
publicstaticfinalvoidtest2(){ Integeri=Integer.valueOf(1000); System.out.println(i); }
分析
理解了上述两个小栗子之后,在回头看一下官方提供的demo,就可以理解了。我们不妨自己也写一个类似的代码
funtest3(){ //Kotlin并不会自动装箱 vali:Int=1000 println(i) //因为j和k都被当做对象操作,因此会将i进行装箱做操,然后复制给j、k valj:Int?=i valk:Int?=i println(j===k) }
反编译成java字节码之后结果同我们猜想的一致:
publicstaticfinalvoidtest3(){ shorti=1000; System.out.println(i); Integerj=Integer.valueOf(i); Integerk=Integer.valueOf(i); booleanvar3=j==k; System.out.println(var3); }
总结
注:在Kotlin中,字符类型不是基本数值类型,是一个独立的数据类型。
上面的整形类型的表示方式并没有使用int、double等java中的关键字,而是使用了封装类来表示这是因为在Kotlin中一切都是对象(没有如同java中的基本类型)。当我们在代码中使用整形数字的时候,Kotlin会自动的将其进行装箱操作
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!