Kotlin基础知识(十二)——基本数据类型和其他数据类型

389 阅读3分钟

一、基本数据类型:Int、Boolean及其他

Kotlin并不区分 基本数据类型和包装类型,永远使用同一个类型。

大多数情况下——对于变量、属性、参数和返回类型——Kotlin的Int类型会被编译成Java基本数据类型int。唯一不可行的例外是泛型类,如集合。

二、可空的基本数据类型:Int?、Boolean?及其他

Kotlin中的可空类型 不能用Java的基本数据类型表示,因为***null只能被存储在Java的引用类型***的变量中。这就意味着任何时候只要使用了基本数据类型的可空版本,它就会编译成对应的包装类型。

三、数字转换

Kotlin和Java之间一条重要的区别就是处理数字转换的方式。

Kotlin不会自动地把数字从一种类型转换成另外一种,即便是转换成范围更大的类型。

为避免意外情况,Kotlin要求转换必须是显式的,尤其是在比较装箱值的时候。

四、“Any”和“Any?”:根类型

和Object作为Java类层级结构的根差不多,Any*类型是Kotlin所有非空类型超类型*(非空类型的根)。

注意***Any是非空类型,所以Any类型的变量不可以持有null值。在Kotlin中如果你需要可以持有任何可能值的变量,包括null在内,必须使用Any?***类型。

在底层,Any类型对应java.lang.Object。Kotlin把Java方法参数和返回类型中用到的Object类型看作***Any***.

五、Unit类型:Kotlin的void

Kotlin中的***Unit类型完成了Java中的void***一样的功能。当函数没什么有意思的结果要返回时,它可以用作函数的返回类型:

fun f(): Unit { ... }

语法上,这和写一个带有代码块体但不带类型声明的函数没有什么不同:

// 显式的Unit声明被省略了
fun f(): { ... }

Kotlin和Unit和Java的void到底有什么不一样呢?Unit是一个完备的类型,可以作为类型参数**,而void却不行。只存在一个值是***Unit类型,这个值也叫作Unit,并且(在函数中)会被隐式返回**。在重写返回泛型参数的函数时这非常有用,只需要让方法返回**Unit***类型的值:

interface Processor<T> {
    fun process(): T
}

class NoResultProcessor: Processor<Unit> {
    // 返回Unit,但可以省略类型说明
    override fun process() {
        // do stuff
        // 这里不需要显式的return
    }
}

六、Nothing类型:“这个函数永不返回”

*Nothing*类型没有任何值,有被当作函数返回值使用,或者被当作泛型函数返回值的类型参数使用才会有意义。在其他情况下,声明一个不能存储任何的变量没有任何意义。

fun fail(message: String): Nothing {
    throw IllegalStateException(message)

>>> fail("Error occurred")
java.lang.IllegalStateException: Error occurred

注意:返回***Nothing的函数可以放在Elvis***运算符的右边做先决条件检查。