[关闭]
@cxm-2016 2017-01-19T11:15:13.000000Z 字数 1650 阅读 2581

Kotlin (二十四)——类型检查与类型转换

Kotlin

版本:1
作者:李颖


类型检查与类型转换

is!is 操作符

我们可以使用 is 操作符, 在运行时检查一个对象与一个给定的类型是否一致, 或者使用与它相反的 !is 操作符:

  1. if (obj is String) {
  2. print(obj.length)
  3. }
  4. if (obj !is String) { // 等价于 !(obj is String)
  5. print("Not a String")
  6. }
  7. else {
  8. print(obj.length)
  9. }

智能类型转换

很多情况下, 在 Kotlin 中你不必使用显式的类型转换操作, 因为编译器会对不可变的值追踪 is 检查, 然后在需要的时候自动插入(安全的)类型转换:

  1. fun demo(x: Any) {
  2. if (x is String) {
  3. print(x.length) // x 被自动转换为 String 类型
  4. }
  5. }

如果一个相反的类型检查导致了 return, 此时编译器足够智能, 可以判断出转换处理是安全的:

  1. if (x !is String) return
  2. print(x.length) // x 被自动转换为 String 类型

&&|| 操作符的右侧也是如此:

  1. // 在 `||` 的右侧, x 被自动转换为 String 类型
  2. if (x !is String || x.length == 0) return
  3. // 在 `&&` 的右侧, x 被自动转换为 String 类型
  4. if (x is String && x.length > 0)
  5. print(x.length) // x 被自动转换为 String 类型

这种 智能类型转换(smart cast) 对于 when{: .keyword } 表达式 和 while{: .keyword } 循环 同样有效:

  1. when (x) {
  2. is Int -> print(x + 1)
  3. is String -> print(x.length + 1)
  4. is IntArray -> print(x.sum())
  5. }

注意, 在类型检查语句与变量使用语句之间, 假如编译器无法确保变量不会改变, 此时智能类型转换是无效的.
更具体地说, 必须满足以下条件时, 智能类型转换才有效:

"不安全的" 类型转换操作符

如果类型转换不成功, 类型转换操作符通常会抛出一个异常. 因此, 我们称之为 不安全的(unsafe).
在 Kotlin 中, 不安全的类型转换使用中缀操作符 as{: .keyword } (参见 操作符优先顺序):

  1. val x: String = y as String

注意 null{: .keyword } 不能被转换为 String, 因为这个类型不是 可为 null 的(nullable),
也就是说, 如果 y 为 null, 上例中的代码将抛出一个异常.
为了实现与 Java 相同的类型转换, 我们需要在类型转换操作符的右侧使用可为 null 的类型, 比如:

  1. val x: String? = y as String?

"安全的" (nullable) 类型转换操作

为了避免抛出异常, 你可以使用 安全的 类型转换操作符 as?{: .keyword }, 当类型转换失败时, 它会返回 null{: .keyword }:

  1. val x: String? = y as? String

注意, 尽管 as?{: .keyword } 操作符的右侧是一个非 null 的 String 类型, 但这个转换操作的结果仍然是可为 null 的.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注