Kotlin 的类型系统

数字类型

Kotlin 中去掉了原始类型,只有包装类型,编译器在编译代码的时候,会自动优化性能,把对应的包装类型拆箱为原始类型。

对于 Kotlin 中的数字类型而言,不可空类型与Java中原始的数字类型对应。

Kotlin Java
Int int
Long long
Float float
Double double

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。

fun main() {
    val a: Int = 1000
    val b: Int = 1000
    println(a == b)
    println(a === b)
}
// true
// true
复制代码

上面返回的都是 true,因为 a、b 它们都是以原始类型存储的,类似于 Java 中的基本数据类型。

fun main() {
    val a: Int? = 1000
    val b: Int? = 1000
    println(a == b)
    println(a === b)
}
// true
// false
复制代码

可空类型 Int? 等价于 Java 中的 Integer 包装类型,这里 a、b 引用不相等。

数组类型

Java 中的数组也是一个较为特殊的类型。这个类型是 T[],这个方括号让我们觉得不太“优雅”。Kotlin 中摒弃了这个数组类型声明的语法。Kotlin 简单直接地使用 Array 类型代表数组类型。完整的定义如下:

public class Array<T> {
    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<T>
}
复制代码

其中构造函数我们可以这么用:

fun main() {
    val square = Array(5) { i -> i * i }

    square.forEach {
        println(it)
    }

}
// 0
// 1
// 4
// 9
// 
16
复制代码

在编程过程中常用的是 boolean[]、char[]、byte[]、short[]、int[]、long[]、float[]、double[];Kotlin 直接使用了 8 个新类型来对应这样的编程场景:

BooleanArray
ByteArray
CharArray
DoubleArray
FloatArray
IntArray
LongArray
ShorArray
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享