编辑: ok2015 | 2017-09-18 |
5 开始引入了自 动装箱/拆箱机制,使得二者可以相互转换.Java 为每个原始类型提供了相应的包装类型. ? 原始类型:boolean,char,byte,short,int,long,float,double. ? 相应的包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double. Kotlin 中去掉了原始类型,只有包装类型,编译器在编译代码的时候,会自动优化性 能,把对应的包装类型拆箱为原始类型. Kotlin 系统类型分为可空类型和不可空类型.Kotlin 中引入了可空类型,把有可能为 null 的值单独用可空类型来表示. 这样就在可空引用与不可空引用之间划分出一条明确的、 显式的 界线 . Kotlin 类型层次结构如图 3-2 所示. 图3-2 Kotlin 类型层次结构 通过这样显式地使用可空类型,并在编译期作类型检查,大大降低了出现空指针异常 的概率. 对于 Kotlin 中的数字类型而言,不可空类型与 Java 中原始的数字类型对应,如表 3-1 所示. Kotlin 中对应的可空数字类型就相当于 Java 中的装箱数字类型,如表 3-2 所示. Kotlin 从入门到进阶实战 ・44・ 表3-1 Kotlin中的数字类型与Java中原始的数字类型 Kotlin Java Int int Long long Float float Double double 表3-2 Kotlin中的可空数字类型与Java中的装箱数字类型 Kotlin Java Int? Integer Long? Long Float? Float Double? Double 在Java 中, 从基本数字类型到引用数字类型的转换过程就是典型的装箱操作, 例如 int 转为 Integer.倒过来,从Integer 转为 int 就是拆箱操作.同理,在Kotlin 中非空数字类型 Int 到可空数字类型 Int?需要进行装箱操作.同时,非空的 Int 类型会被编译器自动拆箱成 基本数据类型 int,存储的时候也会存到栈空间.例如下面的代码,当为 Int 类型的时候, a===b 返回的是 true;
而当为 Int?的时候,a===b 返回的是 false. >
>
>
val a: Int =
1000 >
>
>
val b:Int =
1000 >
>
>
a===b //引用相等 true >
>
>
a==b //值相等 true 上面返回的都是 true,因为 a、b 它们都是以原始类型存储的,类似于 Java 中的基本 数字类型. >
>
>
val a:Int? =
1000 >
>
>
val b:Int? =
1000 >
>
>
a==b true >
>
>
a===b //可空类型 Int?等价于 Java 中的 Integer 包装类型,这里 a、b 引用不相等 false 可以看出,当a、b 都为可空类型时,a 与b的引用是不等的. 等于 号的简单说明 如表 3-3 所示. 表3-3 Kotlin中的 等于 号说明 等于 符号 功能说明=赋值,在逻辑运算时也有效 == 等于运算,比较的是值,而不是引用 === 完全等于运算,不仅比较值,而且还比较引用,只有两者一致才为真 另外,Java 中的数组也是一个较为特殊的类型.这个类型是 T[],这个方括号让我们 觉得不太 优雅 . Kotlin 中摒弃了这个数组类型声明的语法. Kotlin 简单直接地使用 Array 类型代表数组类型.这个 Array 中定义了 get、set 算子函数,同时有一个 size 属性代表数 第3章类型系统与可空类型 ・45・ 组的长度,还有一个返回数组元素的迭代子 Iterator 的函数 iterator().完整的定义如下: public class Array { public inline constructor(size: Int, init: (Int) ->
T) public operator fun get(index: Int): T public operator fun set(index: Int, value: T): Unit public val size: Int public operator fun iterator(): Iterator } 其中,构造函数我们可以这么用: >
>
>
val square = Array(5, { i ->
i * i }) //构造