型変換(キャスト)は、データの型を変換することを指します。
型変換の構文
型変換を行うには変換元変数の前にカッコで変換する型を指定します。
<型> 変数 = (型) 変換元変数;
プリミティブ型の型変換
プリミティブ型間の型変換は、データの値を変更せずにデータ型のみを変換します。
より大きい値を扱える型への変換(例えば int → double)は暗黙の型変換が行われますが、
より小さい値を扱う型への変換(例えば double → int)は明示的な型変換が必要です。
// double型からint型は明示的な型変換が必要
int a = 123.45; //NG
int a = (int)123.45; //OK
// int型からdouble型は暗黙的に型変換される
double d = 123; //明示的なキャストが不要(暗黙の型変換)
// char型からint型は暗黙的に型変換される
int a = 'a'; //97
プリミティブ型のキャストを図にすると以下のようなイメージです。
図の右側へ向けた型変換は暗黙的に行われますが、
左側へ向けた型変換は明示的なキャストが必要です。
オブジェクト型の型変換
オブジェクト型間の型変換は、オブジェクトの実際の型を変えずに型を指定します。
Javaは継承やインターフェースを使用した多態性があるため、スーパークラス型の変数にサブクラスのオブジェクトを代入することが可能です。
逆にスーパークラス型の変数に格納されたオブジェクトをサブクラス型の変数として扱いたい場合には、明示的な型変換が必要です。
class Animal {}
class Dog extends Animal {}
Dog dog = new Dog();
// スーパークラス型の変数にサブクラスのオブジェクトを代入(アップキャスト)
Animal animal = dog; //明示的なキャストは不要
// サブクラス型の変数にスーパークラスのオブジェクトを代入(ダウンキャスト)
Dog newDog = (Dog) animal; //明示的なキャストが必要
参照型のキャストを図にすると以下のようなイメージです。
図の右側へ向けた型変換は暗黙的に行われますが、
左側へ向けた型変換は明示的なキャストが必要です。
型変換まとめ
- 子クラス型を親クラス型に変換することを、アップキャストと呼ぶ
- 親クラス型を子クラス型に変換することを、ダウンキャストと呼ぶ
- アップキャストは明示的なキャストは不要(暗黙の型変換が行われる)
- ダウンキャストは明示的なキャストが必要
- 型変換できないキャストを行うと、実行時にClassCastExceptionが発生する。
(コンパイル時エラーは発生しない)
コメント