返回介绍

类型检查和自动转换

发布于 2025-03-08 18:25:15 字数 2084 浏览 0 评论 0 收藏 0

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)
}

智能转换

在很多情形中,需要使用非明确的类型,因为编译器会跟踪 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 自动转换为 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 表达式和 whie 循环中也会发生

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

“不安全”的转换符

和 如果转换是不被允许的那么转换符就会抛出一个异常。因此我们称之为不安全的。在 kotlin 中 我们用前缀 as 操作符

val x: String = y as String

注意 null 不能被转换为 String 因为它不是 nullable ,也就是说如果 y 是空的,则上面的代码会抛出空异常。

为了 java 的转换语句匹配我们得像下面这样:

val x: String?= y as String?

"安全"转换符

为了避免抛出异常,可以用 as? 这个安全转换符,这样失败就会返回 null :

val x: String ?= y as? String

不管 as? 右边的是不是一个非空 String 结果都会转换为可空的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文