今回はオブジェクト参照型の型変換について説明していきます!
基本データ型と同様、オブジェクト参照型の場合も互換性があれば型変換することが可能です。
その一つがスーパークラス型をサブクラス型に変換する場合です。
早速ですがサンプルをみてみましょう。
■TypeConvRef_01.java
class Super { int a; } class Sub extends Super { int b; } public class TypeConvRef_01 { public static void main(String[] args) { Super sp; Sub sub = new Sub(); sp = sub; System.out.println("コンパイル、実行ともに成功です!"); } }
■実行結果
■解説
・1~3行目
Superクラスが宣言されています。
・5~7行目
Superクラスを親クラスとするSubクラスを宣言しています。
・11行目
Super型の変数を宣言
・12行目
Subクラスをインスタンス化
・13行目
Super型の変数にSubクラスのオブジェクトを代入
■TypeConvRef_02.java
ではもう一つサンプルを挙げてみます。
class Super { int a; } class Sub extends Super { int b; } public class TypeConvRef_02 { public static void main(String[] args) { Sub sub; Super sp = new Super(); sub = sp; } }
■実行結果
■解説
先のサンプルとは変数とオブジェクトの型が逆になっています。
13行目でSub型の変数にSuperのオブジェクトを代入しようとしてますが、上記のようにコンパイルエラーとなってしまいます。
■なぜ型変換できるのか
ではなぜサブクラスはスーパークラスに変換できて、その逆はできないのでしょうか。
ではまずクラスの役割を思い出してみましょう。
クラスは設計図でした。
つまり、「この通りに従ってオブジェクトを作ってね」というものです。
例えばSuperが持っている定義は「a」とし、Subが持っている定義を「b」とします。
SubはSuperを継承するので「a」という定義も加わります。
するとそれぞれの定義は、
- Super → 「a」を持っていること
- Sub → 「a」と「b」を持っていること
以上のようになります。
どうでしょう?これでわかりましたでしょうか?
「a」を持っているSubはSuperの条件を満たしています。
一方で「a」しか持っていないSuperはSubの条件を満たしていません。
このような場合にオブジェクト参照型の型変換が可能になるわけです。
※補足
同じ理由から、実装クラス型をインターフェイス型に変換することも可能です。
■まとめ
・基本データ型と同じように、オブジェクト参照型も型変換が可能
・型変換が可能なパターンは2通り
- 継承関係がある場合(サブクラス型→スーパークラス型)
- 実現関係がある場合(実装クラス型→インターフェイス型)
・その逆はできない
次回はオブジェクト参照型のキャストについて説明します!