基本数据类型

相比于java而言,kotlin不会区分基本数据类型和他们的包装类,都是统一的数据类型,但是他们的底层实现会和java相关。

java中

Int,Boolean之类的基本数据类型都和引用类做了区分,基本数组存值,而包装类存储包含该对象的内存地址的引用。

kotlin中

他不区分,都是用一个类Int,Boolean等。这样就很方便我们的操作。
但是这并不意味着kotlin直接把所有的类都直接写出引用类型了。因为那样的话,就会非常低效。
在运行时,数字类型尽可能的使用最高效的方式存储,大部分情况下—-对于变量,属性,参数和返回类型,kotlin的int类型都会编译为java中的基本数据类型。唯一不可行的就是泛型类,集合。他一定会编译为包装类。

可空数据类型 Int?,Boolean?

这些可空数据类型因为不止能存储基础数据类型,还能存储null,所以肯定是包装类。

这是基于JVM虚拟机实现泛型的方式决定的,JVM不支持用基本数据类型作为类型参数,所以必须使用包装类。
如果要高效的存储基础数据类型的话,要么使用第三方库(Trove4)等。要么用数组存储。

数字转化

在kotlin中没有默认的小范围向大范围自动变化类型,他严格限制具体的数据类型,也提供了相关方法toLong(),toByte()等。为了避免冲突,kotlin中的转化要求必须是显式的。即便是equals方法,2和2L也是不一样的。会返回false

Any,Any?

kotlin中Any就和java中的object一样层级,属于所有类的父类。但是他只是非空类,Any?才包括所有的类。kotlin中使用Any会在字节码中编译为Object

Unit

尽管他与java中的void有着一样的功能,但是它不一样,Unit是一个完备的类型,可以作为类型参数。但是void不行。
而且全局只存在一个Unit类型,这个值也叫Unit,并且在函数中会被隐式的返回,即一个隐藏的return Unit时不需写出来的。
Unit他只有一个实例。也是kotlin的一个特色,相比于java中,要么void,不然一定要添加return返回某个数据。

Nothing类型,这个函数一定不返回

1
2
3
fun fail(message:String):Nothing{
throw IllegalArgumentException(message)
}

Nothing类型,没有任何值,只有被当作函数返回值或者泛型函数返回值时才有意义。
他同样的也可以搭配Evls运算符做判断。