準備工作
準備兩個類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,爲了去除編譯器的警告。