Kotlin类型检测,类型转换

文章目录:

    is 运算符 类型自动转换 as 运算符

is 运算符

is 运算符类似Java中的 instanceof , 用来检查一个对象是否属于某种类型, 其否定形式为 !is 。

open class Doge
class Corgi : Doge()    // Corgi 类 继承自 Doge类.

fun testIs(): Unit {
    val dog = Doge()
    val corgi = Corgi()
    println(dog is Doge) // true
    println(corgi is Corgi) // true

    println(corgi is Doge) // true : 子类is父类
    println(dog is Corgi) // false :父类 !is 子类
}

类型自动转换

在Kotlin中,编译器会根据 is 检查的值,在需要的时候,自动地、安全地 插入类型转换:

fun testLengthF(): Unit {
    strLength("abc")   // abc, length = 3
    strLength(2333)   // 2333, length = 4
    strLength(true)    //true, length = 1

    val corgi = Corgi() // basic.Corgi@3764951d is not a String
    strLength(corgi)  // basic.Corgi@3764951d, length = -1
}

fun strLength(x: Any): Int {
    val r = when(x) {
        is String -> x.length
        is Number -> x.toString().length
        is Char , is Boolean -> 1
        else -> {
            println("$x is not a String")
            -1
        }
    }
    println("$x, length = $r")
    return r
}

as 运算符

as 运算符 用于执行类型转换, 如果转换的类型与指定的类型兼容,那么转换就会成功进行, 如果类型不兼容,使用 as? 运算符就会返回 null .

open class Doge
class Corgi : Doge()    // Corgi 类 继承自 Doge类.

fun testAs(): Unit {
    val dog = Doge()
    val corgi = Corgi()
    println(corgi as Doge) // 子类型可以转为父类型
    println(dog as? Corgi) // 父类型不可以强制转为子类型
    println(dog as Corgi)  // 抛出异常:ClassCastException
}

按照里氏替换原则,父类型强制转为子类型是对 面向对象编程(OOP) 的严重违反, 因为子类型除了包含父类型所有的方法和属性外,还可以有自定义的成员方法和属性, 而父类型则未必具有与子类型相同的成员,所以这种转换是不允许的。

经验分享 程序员 微信小程序 职场和发展