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的字节码 ![这里写图片描述](http://img.blog.csdn.net/20171013135245711?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhtMzE3MTIyNjY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 2 将Kotlin字节码反编译成Java字节码 ![这里写图片描述](http://img.blog.csdn.net/20171013135324119?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhtMzE3MTIyNjY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 通过这种方法,将上面的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); }
html" target="_blank">分析
理解了上述两个小栗子之后,在回头看一下官方提供的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会自动的将其进行装箱操作
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法,包括了Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法的使用技巧和注意事项,需要的朋友参考一下 Android 出现问题Installation e
本文向大家介绍Maven nexus 安装nexus私服出现的问题和解决办法,包括了Maven nexus 安装nexus私服出现的问题和解决办法的使用技巧和注意事项,需要的朋友参考一下 1. 在win10中安装nexus时提示:wrapper | OpenSCManager failed - 拒绝访问。 (0x5) 主要是没有权限。需要以管理员的身份运行 如果你是直接点击 start-nexus
本文向大家介绍vsftpd 出现530 and 500 错误问题解决办法,包括了vsftpd 出现530 and 500 错误问题解决办法的使用技巧和注意事项,需要的朋友参考一下 VSFTP 530 Login incorrect And 500 OOPS: vsftpd: refusing to run with writable anonymous root 错误的解决方法 53
在版本中,Java引入了的概念。 那么为什么我在覆盖未实现的方法时出现编译时错误,为什么上面的测试方法的参数没有以匹配父测试方法签名?
问题内容: 以下代码进行编译(使用Java 8): 但是它是做什么的呢? 取消装箱: 或盒子: 那么它是比较两个对象(按引用)还是按值比较两个变量? 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类会维护一个介于to 之间的值的内部缓存(另请参见TheLostMind的注释)。这就是我在示例中使用的原因,也是为什么我特别询问拆箱/装箱而不是比较结果的原因。 问题答案: 它在JL
本文向大家介绍解决wx.onMenuShareTimeline出现的问题,包括了解决wx.onMenuShareTimeline出现的问题的使用技巧和注意事项,需要的朋友参考一下 wx.onMenuShareTimeline使用注意事项 我在开发测试过程中,发现使用wx.onMenuShareTimeline无效果,没有显示我定义的图片、title和链接,经过调试发现原因如下: 1.图片大小要大于