戻り値とキャスト

以下のようなメソッドがある


Object getObject()
String getString()


それに対してそれぞれを呼び出してみた結果ひとつだけ
エラーが出た


1. Object obj = getObject();
2. String str = getObject();
3. obj = getString();
4. str = getString();


答えは2番である
オブジェクト指向では
親クラスの変数に子クラスのインスタンスを入れれる
子クラスの変数に親クラスのインスタンスは入れれない
これは常識であると思いたい
JavaではすべてのクラスがObjectクラスを継承しているので
String → Object
であるため2番以外は問題ない
ここで、Objectの変数の中にはStringのインスタンスを入れれると
いう性質を利用して
getObject()内でStringのインスタンスをObjectとして扱っていた場合を考える
この場合戻ってきた値はObjectとして扱われているが
実際にはStringが入っているため
Stringの変数に入れても問題ない気がする
そこでそういう場合にはキャストをするのは常識であると思いたい


× String str = getObject();
○ String str = (String)getObject();


実はここまでが序章である
ここから本題に入る
実に長い…


int i = (int)getObject();


このプログラムはどうなるか?
答えはエラーである
intはプリミティブ型なのでObjectを継承していない
整数型が帰ってくるのだとしたらそれは
Integer型であるので


Integer i = (Intger)getObject();
int ii = i.getInt();


のような形となる
ラッパークラスと利用することになる
今回は値を取得するだけだったが
値を格納したり、それを取得したりって操作が
多くなると実際には様々なクラスのインスタンスが格納される場合がある
注意が必要である


ちなみにJava1.5以降のバージョンでは
ラッパークラスとプリミティブ型を暗黙的に変換してくれるので


int i = (Intger)getObject();


と書ける
ただし、特に理由がない場合は総称型を使うようにしよう