@cxm-2016
2017-01-19T11:15:13.000000Z
字数 1650
阅读 3163
Kotlin
版本:1
作者:李颖
is 与 !is 操作符我们可以使用 is 操作符, 在运行时检查一个对象与一个给定的类型是否一致, 或者使用与它相反的 !is 操作符:
if (obj is String) {print(obj.length)}if (obj !is String) { // 等价于 !(obj is String)print("Not a String")}else {print(obj.length)}
很多情况下, 在 Kotlin 中你不必使用显式的类型转换操作, 因为编译器会对不可变的值追踪 is 检查, 然后在需要的时候自动插入(安全的)类型转换:
fun demo(x: Any) {if (x is String) {print(x.length) // x 被自动转换为 String 类型}}
如果一个相反的类型检查导致了 return, 此时编译器足够智能, 可以判断出转换处理是安全的:
if (x !is String) returnprint(x.length) // x 被自动转换为 String 类型
在 && 和 || 操作符的右侧也是如此:
// 在 `||` 的右侧, x 被自动转换为 String 类型if (x !is String || x.length == 0) return// 在 `&&` 的右侧, x 被自动转换为 String 类型if (x is String && x.length > 0)print(x.length) // x 被自动转换为 String 类型
这种 智能类型转换(smart cast) 对于 when{: .keyword } 表达式 和 while{: .keyword } 循环 同样有效:
when (x) {is Int -> print(x + 1)is String -> print(x.length + 1)is IntArray -> print(x.sum())}
注意, 在类型检查语句与变量使用语句之间, 假如编译器无法确保变量不会改变, 此时智能类型转换是无效的.
更具体地说, 必须满足以下条件时, 智能类型转换才有效:
如果类型转换不成功, 类型转换操作符通常会抛出一个异常. 因此, 我们称之为 不安全的(unsafe).
在 Kotlin 中, 不安全的类型转换使用中缀操作符 as{: .keyword } (参见 操作符优先顺序):
val x: String = y as String
注意 null{: .keyword } 不能被转换为 String, 因为这个类型不是 可为 null 的(nullable),
也就是说, 如果 y 为 null, 上例中的代码将抛出一个异常.
为了实现与 Java 相同的类型转换, 我们需要在类型转换操作符的右侧使用可为 null 的类型, 比如:
val x: String? = y as String?
为了避免抛出异常, 你可以使用 安全的 类型转换操作符 as?{: .keyword }, 当类型转换失败时, 它会返回 null{: .keyword }:
val x: String? = y as? String
注意, 尽管 as?{: .keyword } 操作符的右侧是一个非 null 的 String 类型, 但这个转换操作的结果仍然是可为 null 的.
