美文网首页
Kotlin编码窍门之类型检查与类型转换(Type Checks

Kotlin编码窍门之类型检查与类型转换(Type Checks

作者: 已迁至知乎_此不再维护 | 来源:发表于2017-06-03 10:53 被阅读0次

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

职能转换(Smart Casts)

许多情况下,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表达式和while循环中:

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

注意:当编译器不能保证变量在检查和使用之间不会发生改变的时候,职能转换则是不能用的。也就是说,智能转换的使用需要依据以下规则:

  1. val局部变量,总是可以。
  2. val属性:若属性是privateinternal类型的,或者类型检查是执行在属性声明的同一模块中的,则可以使用智能转换。智能转换不能用于open属性或者具有自定义getter的属性。
  3. var局部变量:如果变量在检查和使用之间没有修改,且没有被毁修改它的λ表达式捕获,则可以使用。
  4. var属性:总是不可以。(因为该变量的值可以在任意时刻被任意代码修改)

非安全转换操作("Unsafe" cast operator)

通常,如果一个转换不能够完成的话讲抛出一个异常。因此,我们称之为非安全的。这种非安全的转换在Kotlin中通过中缀操作符as实现:

val x: String = y as String

注意:null不能被转换为String,因为该类型是不能为null的。也就是说,如果变量ynull,则上述代码将会抛异常。为了匹配Java转换语义,在转换右边必须是可null类型:

val x: String? = y as String?

安全转换操作("Safe" (nullable) cast operator)

为了避免异常的抛出,可以使用安全转换操作符as?,当转换失败的时候,将会返回null

val x: String? = y as? String

注意:尽管as?右侧是一个非null类型String,但其转换结果则可以是null

相关文章

网友评论

      本文标题:Kotlin编码窍门之类型检查与类型转换(Type Checks

      本文链接:https://www.haomeiwen.com/subject/zcipfxtx.html