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