型変換
型同士が継承・実装の関係にある場合には、相互に型変換が可能です。
入力例:
open class Person(){}
class MagickPerson():Person(){
fun sayHello(){
println("Hello")
}
}
fun main() {
val mp:Person = MagickPerson()
println(mp is Person)
println(mp is MagickPerson)
① if(mp is MagickPerson){
② mp.sayHello()
}
}
上記のコードが実行可能なのはMagickPerson
がPerson
の派生クラスだからです。
派生クラスのインスタンスは基底クラスのインスタンスとして使用できます。
したがって、派生クラスから基底クラスへの型変換は暗黙的に実施できます。
しかし、基底クラスから派生クラスへの必ずしも可能ではありません。
派生クラスが独自のメンバーを追加している可能性があるからです。
①では型を判定しています。このブロックの配下②であれば
暗黙的にその型として振る舞うことができる点に注意です。
実行結果は以下の通りです。
true
true
Hello
明示的なキャストをしたい場合
as
演算子を使用します。
ただし、asによるキャストは失敗する可能性があります。
open class Person(){}
class MagickPerson():Person(){}
class Student():Person(){}
fun main() {
val person:Person = MagickPerson()
val mp1:MagickPerson = person as MagickPerson
val student:Person = Student()
① val mp2:MagickPerson = student as MagickPerson
}
①でエラーが発生します。
変数student
はPerson
型ですが、実体はStudent
型です。
したがって、MagickPerson
型に変換することができません。