kotlin的类型系统
一.可空性
1.可空类型
问号可以加在任何类型的后面来表示这类型可以保存null引用,kotlin中的类型都表示其非空
没有问号的类型表示其不能存储null引用
2.安全调用运算符 ?.
var name : String? = user?.name
3.Elvis运算符:提供代替null的默认值
fun foo(s : String?){
val t :String = s ?: ""
}//如果s为null,则返回一个空字符串
fun strLen(s : String?) : Int = s?.length ?: 0
4.安全转换 as?
运算符尝试把值转换成指定的类型,如果值不是合适的类型就为null
5.非空断言 !!
运算符可以把任何值转换成非空类型。如果对null做非空断言,则会抛出异常
抛出异常的位置为非空断言所在的位置
6.let函数
let函数用于处理可空表达式,把调用它的对象变成lambda表达式的参数
当参数不为null时,执行lambda表达式;当参数为null时,什么都不发生
email?.let{
sendEmail(it)
}
7.延迟初始化的属性:通过lateinit关键字标记
8.可空类的拓展、类型参数的可空性
二.数据类型
kotlin并不区分基本数据类型和包装类型
在运行时,数字类型会尽可能使用最高效的方式来表示,除了泛型类。
在进行数字转换时,kotlin需要显式的进行转换
val i = 1//int
val l : Long = i.toLong()//显式转换
Any类型
对应Java中的Object类,Any类型是kotlin中所有非空类型的超类型
把基本数据类型的值传递给Any变量是会自动装箱
当kotlin使用Any时,它会被编译成Java字节码中的Object
Unit类型类比于Java的void,Nothing类型表示这个函数永不返回
三.集合与数组
List<Int?>//集合本身不为空,但是列表中每个值可能为空
List<Int>?//集合可能为空,但是列表中的每个值都不为空
只读集合和可变集合
数组的创建
方法 | 作用 |
---|---|
arrayOf | 创建一个数组,包含元素时指定为该函数的实参 |
arrayOfNulls | 创建包含null的数组 |
Array | 构造方法接受数组大小和lambda表达式 |
var array = Array<26>{ i -> ('a' + i).toString() }