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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值