こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのスマートキャストを記述する方法を解説するピヨ!
この第27章では、プログラミング言語であるKotlinのスマートキャストについて、一緒に勉強していきましょう。
この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのスマートキャストについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。
※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。
【Kotlin】Anyクラスについておさらい
スマートキャストの勉強をする前に、Anyについておさらいしておきます。26章では、Anyクラスがすべてのクラスの祖先であることを勉強しました。
では、関数のパラメータの型をAny型にすれば、全てのパラメータを引き渡せる関数ができるの?となりますよね。
そうなんです、できるんです。以下のサンプルコードを見てみましょう。
サンプルコード
以下のサンプルコードでは、Int型とString型の変数をAny型の関数のパラメータに引き渡しています。
fun main() { val testNum = 12345 val testText = "あいうえお" printTest(testNum) printTest(testText) } fun printTest(any: Any) { println("anyの値は「${any}」です") }
出力
サンプルコードを実行すると、以下のように出力されます。
anyの値は「12345」です anyの値は「あいうえお」です
このように、Int型とString型2つの違う型が引き渡されていますが、問題なく動作していることがわかります。この記事では、このことを踏まえてスマートキャストについて勉強していきます。
関数のパラメータの型をAnyにすると、なんでも引き渡せるようになるピヨ!
【Kotlin】スマートキャストとは?
ではスマートキャストについて勉強していきましょう。
判定された型に自動的にキャストされること
型を変換することを「キャスト」と言うのですが、KolinではJavaのように毎回明示的にキャストをする必要はなく、文脈をチェックし変数のタイプを認識して自動的にキャストしてくれます。
自動的に型の変換をしてくれることを、Kotlinではスマートキャストと言います。
is演算子を使う
スマートキャストの仕組みを利用するためには、その前にある変数の中身の型がなにか判定する必要があります。
その為には「is演算子」を使います。is演算子でチェックされた変数は、自動的に判定された型にキャストされます。
変数のタイプを文脈で理解し自動的にキャストしてくれることをスマートキャストと言うピヨ!
【Kotlin】is演算子を使ってみよう
Any型を使うとなんでも引き渡せることがわかり、スマートキャストの概要を理解したところで、まずはis演算子を使ってみましょう。
渡されるパラメータにBirdクラスやPersonクラスなどを追加して、クラスによって処理を分岐して、とあるメッセージを表示するようにします。
とある変数が特定のクラスのインスタンスかどうかを調べる際にis演算子を使います。
以下のサンプルコードを見てみましょう。
サンプルコード
以下のサンプルコードではis演算子を使って、プロパティ変数anyの中身が何かを調べています。
fun main() { val bird = Bird("リンコ",10) var person = Person("ここまる") printTest(bird) printTest(person) } fun printTest(any: Any) { if(any is Bird) { println("このインスタンスはBirdです") } else if(any is Person) { println("このインスタンスはPersonです") } } class Bird(name: String,age: Int) class Person(name:String)
出力
サンプルコードを実行すると、以下のように出力されます。
このインスタンスはBirdです このインスタンスはPersonです
このコードを見ると「if(any is Bird)」や「else if(any is Person)」という条件判断のところでis演算子を使って、プロパティ変数anyの中身がBirdクラスとPersonクラスどちらのインスタンスなのかを判定しています。
is演算子を使うことで、型を確認できるピヨ!
【Kotlin】スマートキャストを使ってみよう
ではここで本題のスマートキャストを利用したコードに入っていきます。まずは以下のコードを見ていきましょう。
サンプルコード
以下のサンプルコードでは、BirdクラスとPersonクラスそれぞれにも関数を持たせて、それぞれのクラスが持っている関数もプロパティ変数anyから呼び出しています。
fun main() { val bird = Bird("リンコ",10) var person = Person("ここまる") printTest(bird) printTest(person) } fun printTest(any: Any) { if(any is Bird) { println("このインスタンスはBirdです") any.fly("黄") } else if(any is Person) { println("このインスタンスはPersonです") any.greet() } } class Bird(val name: String,val age: Int) { fun fly(color: String) { println("${color}色の${name}が飛んでいます。${age}歳です。") } } class Person(val name:String) { fun greet() { println("私の名前は${name}です。") } }
出力
サンプルコードを実行すると、以下のように出力されます。
このインスタンスはBirdです 黄色のリンコが飛んでいます。10歳です。 このインスタンスはPersonです 私の名前はここまるです。
上記のコードでは、Birdクラスのfly関数とPersonクラスのgreet関数を追加しました。
しかしコードの中での呼び出し元はAny型のプロパティ変数anyで、fly関数とgreet関数は存在していないはずですが、エラーが出力されず問題なく呼び出せましたね。
それはなぜでしょうか?
なぜ呼び出せたかと言うと、if文での判定によりプロパティ変数anyの中身が何かチェックされているからです。
例えば「any.fly(“黄”)」というfly関数を呼び出す前のコードの「if(any is Bird)」で、プロパティ変数anyの中身がBirdクラスのインスタンスだとわかっているため、その後の「any.fly(“黄”)」でもanyの中身はBirdクラスのインスタンスだと判断され、エラーが起こりませんでした。
Kotlinでは、1行1行のコードの文法を機械的にチェックするのではなく、その前の文脈もチェックして変数などを認識してくれており、この仕組みのことを「スマートキャスト」と言います。
【Kotlin】if以外でもスマートキャストを使える
Kotlinのスマートキャストという機能では、if文による型の特定だけではなく、型が推測できるのであれば他の方法でもOKです。
サンプルコード
以下のサンプルコードでは、whenを使って条件を判断して型を特定していきます。
fun printTest(any: Any) { when { any is Bird -> any.fly("黄") any is Person -> any.greet() } }
出力
サンプルコードを実行すると、以下のように出力されます。
黄色のリンコが飛んでいます。10歳です。 私の名前はここまるです。
when文でも、問題なく出力されることがわかります。
いきなり「any.fly(“黄”) 」や「any.greet()」と記述してしまうとエラーになりますが、事前にifやwhenでis演算子を使うことによって、プロパティ変数anyの中身を明確にすることで、問題のないコードとして判断されます。
if以外にもwhenでis演算子を使うことで、スマートキャストを利用できるピヨ!
まとめ
この記事では、プログラミング言語であるKotlinのスマートキャストについて勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。
- 関数のパラメータの型をAnyにすると、なんでも引き渡せるようになる
- スマートキャストは自動的に型の変換をしてくれること
- is演算子を使うことで、インスタンスの中身の型を確認できる
- ifやwhenなどの条件判断でis演算子を使うことで、スマートキャストを利用できる
今回勉強した「スマートキャスト」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。
次回の記事では「データクラス」について勉強していくピヨ!
プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!
コメント