type: doc layout: reference category: "Syntax"

title: "Type Checks and Casts"

类型的检查与转换

is!is运算符

我们可以使用is 或者它的否定!is运算符检查一个对象在运行中是否符合所给出的类型:

if (obj is String) {
  print(obj.length)
}

if (obj !is String) { // same as !(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 is automatically cast to String
  }
}

如果错误的检查导致返回,编译器会清楚地转换为一个正确的:

  if (x !is String) return
  print(x.length) // x is automatically cast to String

或者在右边是&&||

  // x is automatically cast to string on the right-hand side of `||`
  if (x !is String || x.length == 0) return

  // x is automatically cast to string on the right-hand side of `&&`
  if (x is String && x.length > 0)
      print(x.length) // x is automatically cast to String

这些智能转换在 when{: .keyword }-expressionswhile{: .keyword }-loops 也一样:

when (x) {
  is Int -> print(x + 1)
  is String -> print(x.length + 1)
  is Array<Int> -> print(x.sum())
}

“不安全”的转换运算符

通常,如果转换是不可能的,转换运算符会抛出一个异常。于是,我们称之为不安全的。在Kotlin这种不安全的转换会出现在插入运算符as{: .keyword } (see operator precedence):

val x: String = y as String

记住null{: .keyword }不能被转换为不可为空的String。例如,如果y是空,则这段代码会抛出异常。为了匹配Jave的转换语义,我们不得不在右边拥有可空的类型,就像:

val x: String? = y as String?

“安全的”(可为空的)转换运算符

为了避免异常的抛出,一个可以使用安全的转换运算符——as?{: .keyword } ,它可以在失败时返回一个null{: .keyword }:

val x: String? = y as? String

记住尽管事实是右边的as?{: .keyword }可使一个不为空的String类型的转换结果为可空的。


翻译By Wahchi