最适合Android程序员的kotlin笔记——类型系统
2020-01-06 本文已影响0人
朱_c713
引言:
kotlin对可空的类型和只读集合的支持是特别的
kotlin 去掉了java类型系统中不必要的细节或者有问题的特性,比如把数组当成头等公民来支持
可空性
- 现代编程语言包括kotlin解决空指针的方法是吧运行时的错误转变成编译期的错误
- 如果一个变量可以为null,对变量的方法的调用就是不安全的,会导致空指针,kotlin不允许这样的调用,因而可以阻止许多可能的异常
举例来讲:
fun strLen(s: String?) = s.length
注意:
Type?相当于 Type or null
以传参为例,如果加入了问号,就相当于,可以传入null。因此上面的方法就会被编译器识别,s.length下划线红色,报错。没有问号的类型表示这种类型的变量不能存储null引用,因此去掉问号,编译器识别为正常。
类型的含义
- 类型就是数据的分类。。。决定了该类型可能的值,以及该类型的值上可以完成的操作
- kotlin的可空类型为这类问题提供了全面的解决方案
- 区分开可空类型和非空类型使事情变得明朗:那些对值的操作是允许的,那些操作会导致运行时的异常并因此被禁止。
- 可空和飞空的对象在运行时,没有什么区别;
- 可空类型并不是非空类型的包装。所有的检查都发生在编译期。
- 这意味着使用kotlin的可空类型并不会在运行时,带来额外的开销
安全调用符——“?.”
- 注意是问号点,不要分开,分开你将获得更少的领悟。
- 安全调用运算符,是kotlin弹药库中最有效的一种工具:他允许把一次null检查和一次方法调用合并为一个操作。
有了这个:
s?.toUpperCase()
上面的代码就相当于:
if (s!=null) s.toUpperCase() else null
即:如果你试图调用一个非空值的方法,该方法会正常执行,否则调用不会发生,而整个表达式的值为null
注意:这次调用的结果类型也是可空的,即s?.toUpperCase() 的结果类型是:String?
- 安全调用方法不但可以调用方法,也可以调用属性
Elvis运算符——“?:”
- kotlin 有方便的运算符来替代null的默认值——他就是“?:”
笔者语:
我们可以在代码代用的过程中使用Type? ,在代码调用的下游,使用?: 赋一个默认值来保证程序正常运行。
或者在代码的上游如下所示:val t:String=s?: "" 为变量赋一个默认初始值,来防止空异常。这一切取决你
- 像throw 这样的操作其实是表达式,所以他也可以放在Elvis运算符的右边。
非空断言——“!!”
- 非空断言可以把任何值转换成非空类型,如果用在null身上,则会抛出异常
- !!看起来很粗暴,这是有意为之,kotlin设计者试图说服你思考更好的解决方案
- 尽量避免在一行中使用多个非空断言,这样报错的时候,我们可以更好的定位是哪一行代码
kotlin为String提供的额外函数
.isEmpty()
.isBlank()
.isEmptyOrNull()
.isNullOrBlank()
Any和Any?
- 不同于java,kotlin并不区分基本数据类型和他们的包装类
- 和object类型作为java类层级结构的根差不多,Any类型使kotlin所有非空类型的根。
- java中object类型只是引用类型的根,而在kotlin中,Any是所有类型的超类型,包含int这一类的基本数据类型
Unit类型——kotlin的void
- kotlin中的unit 类型完成了java中的void一样的功能,当函数没有什么有意思的结果返回时,可以使用他作为函数的返回类型。
- 不同之处,unit 是一个完备的类型,可以作为类型参数,而void却不行。
Nothing类型:这个函数永不返回
可空性和集合
List<Int?> 可以持有Int 或者Null