AndroidStudio・なぜ型キャストするのか
|
目次
Javaの「オブジェクト指向」に関係してきますが、「型のキャスト」ってなぜ必要なのか・・。
簡単な例を使ってまとめていきたいと思います。
以前に記述したAndroidソースの確認
「AndroidStudioちっちゃなプログラムで学習(1)」の記事で少し触れた部分のソースです
(記事へのリンクはこちら)
//表示用のテキストビューに出力 TextView text=(TextView)findViewById(R.id.txVwResult); String strResult="カーネルのバージョンは・・" + '\n' +verInfo + '\n' + "です"; text.setText(strResult);
TextView text=(TextView)findViewById(R.id.txVwResult);
この部分で型キャストを行っています。なぜ必要なのかを考えます。
簡単な継承図でクラスの親子関係を学ぶ
簡単なクラス継承図をみる
実際の生態系とは違っていると思いますが、ここでの例です。
クラス継承図から読み取れるルール
クラス「いきもの」が一番の親クラスになります。ここでの特性(「生きる」「食べる・飲む」)はこの下の子クラスすべてに引き継がれていきます。
子クラスが初めて持つ特性は親クラスには存在しません。クラス「犬」には特性「ほえる」がありますが、親クラス「動物」「いきもの」には特性「ほえる」はありません。
親子関係のないクラス間では、特性が引き継がれません。クラス「犬」「猫」には、クラス「鳥」の特性である「飛ぶ」はありません。
子クラスは、親クラスの特性も引き継いでいるため、親クラスとしても振る舞うことが出来ます。クラス「犬」「猫」であればクラス「動物」として振る舞うことが出来ます。
クラス「犬」「猫」「鳥」「動物」全てがクラス「いきもの」として振る舞うことが出来ます。
ゆえに、クラス「犬」「猫」「鳥」「動物」のもの全てをまとめてクラス「いきもの」として扱うことが出来ます。
ただし、実際は「犬」であったとしても、「いきもの」クラスとして振る舞っている場合は、クラス「犬」の特性である「ほえる」ことは出来ません。「いきもの」クラスには「ほえる」特性がないためです。
少しややこしくなってきましたが、ここが重要です!
「犬」は「いきもの」として振る舞うことが出来ます。
ただし「いきもの」の状態では「ほえる」ことは出来ません。「ほえる」ことをさせたければ「いきもの」クラスから「犬」クラスに変換してあげればいいのです。
(「猫」クラスであるものを「いきもの」から「犬」に誤変換してしまった場合はエラーになります)
ただし「いきもの」の状態では「ほえる」ことは出来ません。「ほえる」ことをさせたければ「いきもの」クラスから「犬」クラスに変換してあげればいいのです。
(「猫」クラスであるものを「いきもの」から「犬」に誤変換してしまった場合はエラーになります)
スポンサードリンク
TextViewの継承図で型キャストが必要な理由を知る
上で学んだことをもとに、実際の継承図を見てみます。
TextViewのクラス継承図をみる
親子継承関係を確認
先ほどと同じように親子関係を見てみます。
「Object」クラスが一番の親クラスであり、この特性は全ての子クラスに引き継がれます。
「Object」の下に「View」クラスがあり、さらにこの下に「TextView」クラスがあります。今回はこの「TextView」クラスと「setText」メソッドについて調べています。
「TextView」クラスには「setText」メソッドがありますが「View」クラスには「setText」メソッドはありません。
「TextView」クラスは「View」クラスとして振る舞うことが出来ます。が、「View」クラスとして振る舞っているときは「setText」メソッドを使うことは出来ません。
そしてまた、重要なところです
「TextView」は「View」として振る舞うことが出来ます。
ただし「View」の状態では「setText」メソッドを使うことは出来ません。メソッドを使う場合は「View」クラスから「TextView」クラスに変換(キャスト)してあげればいいのです。
ただし「View」の状態では「setText」メソッドを使うことは出来ません。メソッドを使う場合は「View」クラスから「TextView」クラスに変換(キャスト)してあげればいいのです。
結局、型キャストとは
再度、最初に見たソースを確認します。
//表示用のテキストビューに出力 TextView text=(TextView)findViewById(R.id.txVwResult); String strResult="カーネルのバージョンは・・" + '\n' +verInfo + '\n' + "です"; text.setText(strResult);
「findViewById」メソッドは「View型」として画面上のパーツを返してきます。画面上に配置されるパーツは地図や文字、ボタン等色々なものがあります。それぞれ色々なクラス型になっています。この色々なクラスに対応するために、親クラスである「View型」として返しているのです。
画面上にある「txVwResult」という名称のパーツ(「TextView」型)を「findViewById」メソッドで取得しています。戻ってくるのは「View型」であるため、戻り値を「TextView」型にキャストし、「TextView」型の変数「text」に格納しています。
表示する文字列を用意して変数「strResult」に格納し、「TextView」型の変数「text」の「setText」メソッドに渡しています。
これにより、画面上にある「txVwResult」という名称のパーツ(「TextView」型)に文字列が表示されます。
型キャストしているのは、「View」型のままでは「setText」メソッドが使えないためでした。
スポンサードリンク
コメントを書き込む