一、基本数据类型: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***运算符的右边做先决条件检查。