Kotlin类型检测,类型转换

Kotlin类型检测,类型转换,第1张

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) 的严重违反,
因为子类型除了包含父类型所有的方法和属性外,还可以有自定义的成员方法和属性,
而父类型则未必具有与子类型相同的成员,所以这种转换是不允许的。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5523346.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-13
下一篇2022-12-13

发表评论

登录后才能评论

评论列表(0条)

    保存