5. Kotlin的类型系统
5.1 可空性
5.1.1 可空类型
5.1.1.1 : ?
问好可以加在任何类型的后面来表示这个类型的变量可以存储null引用:String?, Int?, 等等
在Kotlin中没有问好类型表示的这种类型的变量不能存储null引用。说明Kotlin中的所有常见类型都是非空给。
比如下面的调用会被编译器报错
fun strLen(s : String) = s.length
fun main(args : Array<String>){
strLen(null) //这里编译器会报错
}
注意:一旦你有一个可空类型的值,能对他进行的操作也会受到限制。
- 不能再调用一些方法。
- 不能把它赋值给非空类型的变量
- 不能把可空类型的值传给拥有非空类型参数的函数
使用姿势:
如果你在函数里增加了null的检查,即就是和null进行了比较,此时编译器就会记住,并且在这个比较发生的
作用域内把这个值当作非空处理。
demo:
fun strLen(s : String?) : Int{
return if(s != null)
s.length
else
0
}
strLen(null) //合法的代码
5.1.1.2 :安全调用运算符 ?.
解释:允许把一次null检查和一次方法调用合并为一个操作。
fun printAllCaps(s : String?){
val allCaps = s?.toUpperCase()
println(allCaps)
}
printAllCaps("abd")
//输出:ABD
printAllCaps(null)
//输出:null
也可以多个安全调用链接在一起
class Address(val streetAddress : String, val zipCode : Int, val city : String, val country : String)
class Company(val name : String, val address : Address?)
class PersonT(val name : String, val company : Company?)