本讲的 Kotlin 知识部分记录区间/范围、类型检查和转换的简要笔记。
Kotlin
区间/范围(Ranges)
range 表达式是通过 rangeTo 函数形成的。rangeTo 函数拥有形如 ..
的操作符,该操作符是用 in
和 !in
实现的。 Range 可以对任何可比较的类型做操作,但对整数基本类型是优化过的。
基本写法
0..100
表示 [0,100]1 until 100
表示 [0,100)i in 0..100
判断 i 是否在区间 [0,100] 中
一些实用的函数
rangeTo()
rangeTo()
函数仅仅是调用 *Range 的构造函数downTo()
倒序迭代
reversed()
返回反向的级数
step()
使用指定步数的迭代
until
不包括其结束元素的区间
使用例子
1 | // Checking if value of comparable is in range. Optimized for number primitives. |
类型检查和转换
is
与 !is
操作符
Kotlin 在运行时通过使用 is
操作符或其否定形式 !is
来检查对象是否符合给定类型。
is
运算符类似 Java 中的 instanceof
:
1 | "abc" instanceof String |
is
运算符可以检查对象 A 是否与特定的类型 X 兼容(此对象 A 是 X 类型或者派生于 X 类型),还可以用来检查一个对象(变量)是否属于某数据类型。
1 | if (obj is String) { |
智能转换
在大多数情况下,不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is
检查,并在需要时自动插入(安全的)转换:
1 | if (x is String) { |
编译器足够聪明,能够知道如果反向检查导致返回,那么该转换是安全的:
1 | if (x !is String) return |
或者在 ||
和 &&
的右侧:
1 | // `||` 右侧的 x 自动转换为字符串 |
这样的转换用于 when 表达式
和 whie 循环
中也一样:
1 | when (x) { |
“不安全的”转换操作符
如果转换是不可能的,转换操作符会抛出一个异常。因此,我们称之为不安全的。 Kotlin 中的不安全转换由中缀操作符 as 完成:
1 | val x: String = y as String |
注意,null 不能转换为 String
因该类型不是可空的, 即如果 y
为空,上面的代码会抛出一个异常。 为了匹配 Java 转换语义,我们必须在转换右边有可空类型,就像:
1 | val x: String? = y as String? |
“安全的”(可空)转换操作符
为了避免抛出异常,可以使用安全转换操作符 as?,它可以在失败时返回 null:
1 | val x: String? = y as? String |
请注意,尽管事实上 as? 的右边是一个非空类型的 String
,但是其转换的结果是可空的。