引き続き型変換について説明していきます!
今回はオブジェクト参照型のキャストです。
これまた基本データ型と同様、オブジェクト参照型もキャストすることができます。
早速サンプルをみてみましょう!
■TypeConvRefCast_01.java
class Super { int a; } class Sub extends Super { int b; } public class TypeConvRef_01 { public static void main(String[] args) { Sub sub; Super sp = new Sub(); sub = (Sub) sp; System.out.println("コンパイル、実行ともに成功です!"); } }
■実行結果
■解説
・12行目
ここで暗黙的型変換が行われています。
Superクラス型の変数にSubクラス型のオブジェクトを代入しています。
・13行目
ここでキャストが行われています。
一度Sub型にしたものをSuper型に戻しています。
これでコンパイル、実行ともに成功します
オブジェクト参照型のキャストはスーパークラス型に変換されたサブクラスオブジェクトを元に戻す際に使用されます。
ではもう一つサンプルをみてみましょう。
■TypeConvRefCast_02.java
import java.util.ArrayList; public class TypeConvRefCast_02 { public static void main(String[] args) { ArrayList countries = new ArrayList(); countries.add("アメリカ"); countries.add("イギリス"); countries.add("ウルグアイ"); countries.add("エジプト"); countries.add("オランダ"); System.out.println("先頭の文字を並べると、"); for (int i= 0; i < countries.size(); i++) { System.out.println(countries.get(i).CharAt(0)); } System.out.println("です"); } }
■実行結果
実行するとコンパイルエラーが出ます。
内容をみてみると、「Object型」からcharAtメソッドを呼び出そうとしていることが原因とわかります。
■解説
・5行目
ここではArrayListが用いられていますが、ジェネリックスが使用されていません。
これ自体問題はありませんが、ジェネリックスでデータ型を指定しない場合は「Object型」として格納されます。
・6~10行目
String型の値が5つ格納されていますが、実は「Object型」に変換されて格納されています。
・14行目
charAtメソッドを呼び出そうとしてますが、このメソッドはStringクラスに定義されているものです。
ArrayListの要素はObject型なので、そこからcharAtメソッドを呼び出すことはできません。
正しくコンパイル、実行できるよう修正するには以下の2通り考えられます。
- 5行目・・・ArrayList<String> countries = new ArrayList<String>();
- 14行目・・・System.out.println(((String) countries.get(i)).charAt(0));
1つ目がジェネリックスを用いる方法。
2つ目がキャストを用いる方法です。
これで実行することができます。
※一般的にはジェネリックスを用います
■まとめ
・基本データ型と同様、オブジェクト参照型もキャストすることができる
・スーパークラス型に変換されたサブクラスオブジェクトを元に戻す場面で用いられる