Java -参照型の型変換-
基本データ型では値の暗黙の型変換やキャストが行えますが、参照型にも同様な機能があります。
参照型の暗黙の型変換
変換元 | 変換先 | 説明 |
---|---|---|
配列 | 配列 | 配列の要素のデータ型が型変換のルールに適合していれば可能 |
配列 | クラス | 配列からObject型への変換 |
配列 | インタフェース | 配列からCloneableまたはSerializableインタフェースへの変換 |
クラス | 配列 | 暗黙の型変換は不可 |
インタフェース | 配列 | 暗黙の型変換は不可 |
クラス | クラス | サブクラスからスーパークラスへの変換 |
クラス | インタフェース | インタフェースを実装しているクラスからインタフェースへの変換 |
インタフェース | クラス | インタフェース型からObject型への変換 |
インタフェース | インタフェース | サブインタフェースからスーパーインタフェースへのサブ変換 |
配列から配列への型変換
あるデータ型の配列を別のデータ型の配列に暗黙的に型変換できます。
ただし、変換元の配列データ型が変換先の配列のデータ型のサブクラスであり、 どちらの配列も同じ次元(例えば、変換元が2次元で変換先も2次元)であることが条件です。
配列からクラスへの型変換
一般的に参照型の型変換は、変換する型が継承元のクラスやインタフェースの場合は、 暗黙的に行われます。
配列は、java.lang.Objctクラスを継承していますので、配列をObjectクラスの インタフェースとみなして、そのアドレス情報をObjectクラスの参照型変数に代入することが 可能です。
クラスやインタフェースの暗黙の型変換
あるクラスへの継承元のクラスへの型変換、つまり、サブクラスからスーパークラスへの型変換は暗黙的に行うことができます。
同様にあるクラスが実装しているインタフェース型への型変換も暗黙的に行えます。
これらの型変換は、ポリモフィズムを実現する際に頻繁に利用されます。
参照型のキャスト
参照型でも、基本データ型と同様にキャスト演算子による型変換を行うことができます。
変換元 | 変換先 | 説明 |
---|---|---|
配列 | 配列 | 配列がキャストされる場合、配列のそれぞれの要素がすべてキャストされる型に変換できれば可能 |
配列 | クラス | 配列からObject型へキャスト(暗黙の型変換でも可) |
配列 | インタフェース | キャストは不可能 |
クラス | 配列 | Object型から配列のキャスト |
インタフェース | 配列 | キャストは不可能 |
クラス | クラス | スーパークラスからサブクラスへのキャスト。 または、サブクラスからスーパークラスへのキャスト |
クラス | インタフェース | インタフェースを実装していないクラスからインタフェースへのキャスト |
インタフェース | クラス | インタフェースからfinalでないクラスへのキャスト |
インタフェース | インタフェース | 継承関係のないインタフェースからインタフェースへのキャスト |
配列のキャスト
キャスト演算子を利用して、配列型変数のデータ型を強制的に指定したデータ型に変換することができます。
構文
(データ型 [])参照型変数名
配列のキャストを行う場合は、変換前のデータ型と変換後のデータ型は以下のいずれかの継承関係になければいけません。
- 変換前のデータ型が、変換後のデータ型のサブクラスである。
(キャストしなくても、暗黙の型変換も可能。) - 返還前のデータ型が、変換後のデータ型のスーパークラスである。 ただし、変換前の配列型変数は変換後と同じデータ型であるか、そのサブクラスのインスタンスを 参照していることが必要
クラスやインタフェースのキャスト
クラスやインタフェースも強制的なキャストによって、他の型へ変換することができます。
しかし、配列のキャスト同様、継承関係にないデータ型に変換しようとするとコンパイルエラーとなります。
ただし、インタフェースとクラス、または、インタフェースどうしのキャストをする場合は、継承関係である必要はありません。