准备工作
准备两个类Person
与Child
Person类如下:
open class Person(name: String, age: Int) {
var mName = name
var mAge = age
open fun printInfo(): Int = Log.e("TAG", "$mName.....$mAge")
}
Child类如下:
class Child(name: String, age: Int, canWalk: Boolean) : Person(name, age) {
var mCanWalk = canWalk
override fun printInfo(): Int = Log.e("Child", "Child...$mName...$mAge...$mCanWalk")
fun printCanWalk() = Log.e("TAG", "Child Can Walk....$mCanWalk")
}
类型判断
在java中使用instanceof
来判断类型。而在Kotlin中,则是使用is
来判断:
var person = Person("Bob", 30)
if (person is Child) {
person.printCanWalk()
} else {
person.printInfo()
}
可以看到在判断完类型后,可以直接调用该类型的函数。这部分是编译器替我们完成的,并且在条件表达式中同样可以使用
if (person is Child && person.mCanWalk) {
person.printCanWalk()
}
类型强转
当有确定类型当时候,就可以使用as
进行强制转换了:
var person = Person("Bob", 30)
var child = person as Child
但是如果在强转当时候,发现类型不匹配,则会报Exception。而如果是null
类型的对象强转时,可以通过?
来允许可空数据进行判断
var person : Any = Person("Bob", 30)
var child: Child? = person as? Child
child?.printCanWalk()
这样的话,当类型判断为空时,则会返回null,而在执行child?.printCanWalk()
语句时,会判断child
是否为空,如果为空的话,则不会执行,如果不为空的话,就会执行。
而将person标为Any
,可以相当于Java中的Object,为了去除编译器的警告。