Kotlin之类型系统
可空类型
- 在任何类型后加“?”表示该变量可为空。
val a: Int? = null
。
安全的调用
- 使用“?.”进行安全调用。
- 实现方式:仍旧使用if判空。
student?.name
。
合并运算符
- 使用“?:”运算符。
-
val result = a ?: 1
非空断言
- 使用“!!”操作符。
student!!.name
。
let
- 调用某个对象的let函数,该对象会作为函数的参数,在函数块内可以通过it指代该对象。返回值为函数块的最后一行或指定的return表达式。
类型检查
- 使用“is”关键字。
- 实现方式:仍旧使用Java的instanceof。
- 相当于Java的instanceof。
强制类型转换
- 使用“as”关键字,如果类型可空,使用“as?”。
Any:非空类型的根类型
- 它和Java的Object根类相似,它是Kotlin中所有非空类型的根类。
- 实现方式:当在Kotlin的函数中使用Any时,它会被编译成Java字节码中的Object。
Nothing:类型层次结构的最底层
- 它是没有实例的类型。
- 它只包含一个值:null,因此,可以使用null作为任何可空类型的值。
- Nothing类型的表达式不会产生任何值。任何返回值为Nothing的表达式之后的语句都是无法执行的。
- kotlin中的流程控制中与跳转相关的表达式如return、throw等,它们的返回值都是Nothing。
数组
- 使用arrayOf函数,对应Array类型。
- 使用intArrayOf函数,对应IntArry类型,相当于Java的int[],但是IntArry与上面Array类型并不存在关系。
-
val intArr = arrayOf(1, 2, 3)val intArr1 = intArrayOf(1, 2, 3)
泛型
- 泛型的优点:
- ①类型检查:能在编译时就检查出错误;
- ②语义化:比如声明一个List<Dog>就可看出这是一个存储狗狗对象的集合;
- ③自动类型转换:获取数据时不需要进行类型转换;
- ④通用性:能写出更加通用的代码。
- 使用arrayListOf()方法创建一个ArrayList。
- 这里不用显式申明泛型参数的类型。
val intArrayList = arrayListOf(1, 2, 3)
。
- 当然也可以显示的申明。
val intArrayList = arrayListOf<Int>(1, 2, 3)
。
- 这里不用显式申明泛型参数的类型。
- 泛型上界:
- 在Java中,使用extends关键字进行定义,如:
T extends Fruit
。 - 而在Kotlin中,也仅仅换成对应的继承符号“:”而已,
T: Fruit
。
- 在Java中,使用extends关键字进行定义,如: