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