Kotlin的数据类型和集合

参考链接

《Kotlin实战》

基本类型

在Kotlin中并不区分基本数据类型和包装类型,例如:

1
2
3
4
5
6
val i: Int = 1
val list: List<Int> = listOf(1, 2, 3)

fun showProgress(progress: Int){
val percent = progress.coerceIn(0, 100)
}

大多数情况下Kotlin的Int类型会被编译成Java的基本数据类型,用作泛型类型参数的基本类型会被编译成Java的包装类型。

在Kotlin中的可空类型不能用Java的基本类型表示(例如:Int?、Boolean?),这个时候会被编译成对应的Java包装类型。

1
var list: List<Int> = listOf(1, 2, 3)

上面代码的listOf集合类的参数是泛型,所以会编译成java的包装类型,所以要高效的存储基本类型建议用数组来存储。

数字转换

在Kotlin中不会自动进行数字类型转换,必须显式的进行转换。

1
2
val i = 1
val l: Long = i.toLong()

每一个基本数据类型都有对应的转换方法(Boolean除外)

但是在下面这种情况会发生自动转换(使用L, f等类型标志)

1
2
val b: Byte = 1
val l = b + 1L

上面l的类型是Long

根类型Any

Any类型是Kotlin所有非空类型的超类型(包括像Int这样的基本类型)。Any类似于Java中的Object

注意:Any是非空类型,如果要使用可空类型可以用Any?

1
2
val answer: Any = 40
//Any是引用类型,所以40会被自动装箱

Unit类型

Kotlin中Unit和Java中的void一样,当函数没有返回值的时候可以用Unit作为返回类型。

1
fun f(): Unit { ... }

Unit可以省略掉。

Nothing类型

可空集合

1
val result = ArrayList<Int?>()

只读集合和可变集合

Kotlin中Collection接口可以遍历集合中的元素,执行读取操作,但是无法修改。

MutableCollection接口继承自Collection,可以实现集合中元素的修改。

1
2
3
4
5
fun <T> copyElements(source: Collection<T>, target: MutableCollection){
for (item in source){
target.add(item)
}
}