Java 型変換(Casting) - 変数のデータ形式変換
型変換(Casting)
データ型を変換することを型変換(Casting、タイプキャスト)という。
(type)var
type: データ型
var: 変数名
一般タイプの型変換
まず、基本形式では小さい形式を大きい形式へ割り当てることができる。たとえば int 型の値を long 型へ割り当てる場合である。大は小を含むことができるということだ。これを拡大変換、または暗黙的型変換という。
暗黙的型変換(Wider Conversion)
int i = 10;
double d = i;
long l = i;
float f = 3.14f;
d = f;
しかし、逆に縮小変換、または明示的型変換はそのままでは不可能である。long 型の値が int 型に常に保存できるとは限らないためである。
したがって、明示的に long 型の値を int 型へキャスト(変換)しなければならない。キャストでは対象変数の直前に「(型名)」を付ければよい。
明示的型変換(Narrow Conversion)
public class Cast {
public static void main(String[] args) {
long l = 50;
int i = (int) l;
System.out.println(1 + i);
}
}
クラス/インターフェース型変換
同様に、クラス/インターフェース型の値もキャストできる。クラス型/インターフェース型をキャストできるのは、代入する形が代入先の形の派生クラスまたは実装体である場合である。
たとえば、Hamster クラスが Animal クラス a のサブクラスであれば、次のようなキャストが可能である。
Animal a = new Hamster();
Hamster h = (Hamster) a;
しかし、次のようなコードは不可能である。
Animal c = new Cat();
Hamster h = (Hamster) c; // キャストエラー
変数 c は Animal 型だが、その実体は Cat オブジェクトだからである。
このようなエラーを防ぐには instanceof 演算子を使う必要がある。instanceof 演算子は、オブジェクトが指定されたクラスまたはスーパークラスのインスタンスであるかを判断する。クラス型のキャストでは、あらかじめ instanceof 演算子で実際の形を判断し、安全にキャストを実行できる。
Animal c = new Cat();
if (c instanceof Hamster) {
Hamster h = (Hamster) c;
}