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

 更新时间:2017年10月15日 10:27:37   作者:Danny_姜  
这篇文章主要介绍了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的字节码 ![这里写图片描述](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);
 }

分析

理解了上述两个小栗子之后,在回头看一下官方提供的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会自动的将其进行装箱操作

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

相关文章

  • java实现web实时消息推送的七种方案

    java实现web实时消息推送的七种方案

    这篇文章主要为大家介绍了java实现web实时消息推送的七种方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Java并发控制机制详解

    Java并发控制机制详解

    这篇文章主要为大家详细介绍了Java并发控制机制,什么是Java并发控制机制,Java并发控制机制的作用,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • mybatis接收以逗号分隔的字符串批量查询方式

    mybatis接收以逗号分隔的字符串批量查询方式

    这篇文章主要介绍了mybatis接收以逗号分隔的字符串批量查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java使用SFTP上传文件到资源服务器

    java使用SFTP上传文件到资源服务器

    这篇文章主要介绍了java使用SFTP上传文件到资源服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 使用Spring Boot进行单元测试详情

    使用Spring Boot进行单元测试详情

    这篇文章主要介绍了使用Spring Boot进行单元测试详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 解决@RequestBody使用不能class类型匹配的问题

    解决@RequestBody使用不能class类型匹配的问题

    这篇文章主要介绍了解决@RequestBody使用不能class类型匹配的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • WebClient抛UnsupportedMediaTypeException异常解决

    WebClient抛UnsupportedMediaTypeException异常解决

    这篇文章主要为大家介绍了WebClient抛UnsupportedMediaTypeException异常的解决方案,文中给大家介绍了六中方案,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】

    Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】

    这篇文章主要介绍了Java实现操作JSON的便捷工具类,基于重写Google的Gson实现,涉及java针对json数据的各种常见转换操作实现技巧,需要的朋友可以参考下
    2017-10-10
  • SpringBoot依赖和代码分开打包的实现步骤

    SpringBoot依赖和代码分开打包的实现步骤

    本文主要介绍了SpringBoot依赖和代码分开打包的实现步骤,,这种方法将依赖和代码分开打包,一般更新只有代码修改,Pom文件是不会经常改动的,感兴趣的可以了解一下
    2023-10-10
  • Java Builder模式构建MAP/LIST的实例讲解

    Java Builder模式构建MAP/LIST的实例讲解

    下面小编就为大家带来一篇Java Builder模式构建MAP/LIST的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论