since: Jan./4th/2002; revised: Dec./25th/2001
前節までで、基本データ型と、文字列型の変数に付いて紹介しました。変数は次の二つに分かれます:
いずれにしても、変数には型があり、異なる型の変数同士は、代入しようとするとコンパイルエラーが起こることがあります。変数の型を自動的に変換してくれないときに、プログラマが明示的に型変換を記述する方法がキャストです。
基本データ型の場合、代入によって精度が落ちなければ、自動的に型変換してくれる。例えば、整数を浮動小数点数に代入することはできても、その逆は小数点以下の数字が欠落してしまうので、自動的な型変換はしてくれません。
代入文の左辺と右辺で、左辺の変数の方がバイト数が大きければ、自動的に型変換されます。これを拡張型変換と呼びます。左辺の方が小さければ、代入できません。
double > float > long > int > short > byte > char
double d=3.1415; int i=10; d=i;
d=i
が代入文で、 i
の値が d
にコピーされます。元々 d
が保持していた値は失われます。この例は、int
型変数の double
型変数への代入文なので、問題なく型変換が実施され、精度が落ちることはありません。
明示的に型変換する仕組みをキャストと呼びます。例えば、代入文で左辺の変数の方がバイト数が小さい場合、右辺のバイト数を落とすように明示してやらないと代入できません。これを縮小型変換と呼びます。
double d=3.1415;
int i=10;
i=(int)d;
浮動小数点数から整数への変換は、小数点数以下の切り捨てが行われます。且つ、バイト数が異なる場合は、下位バイトから格納され、収まらない上位バイトは切り捨てられます。従って、思いもよらない値が代入されることがありますので、注意してください。
次のサンプルは、8ビット整数 byte
型に、32ビット型整数 int
を代入しています。
class TestCast {
public static void main(String[] args) {
byte b=10;
int i=345;
System.out.println(i+": "+Integer.toBinaryString(i));
b=(byte)i;
i=b;
System.out.println(" " + i+": "+Integer.toBinaryString(i));
}
i
をキャストして b
に代入しています。
Integer.toBinaryString()
は、引数のビット列を返すメソッドです(参照: Integer
クラス)。ビット列を出力したい対象は b
なのですが、このメソッドは引数に int
型の値しかとれないので、 b
を i
に代入しなおして i
を引数にしています。この代入は拡張型変換なので、問題なく処理されれます。
C:\Java>javac TestCast.java C:\Java>java TestCast 345: 101011001 89: 1011001
int i=345
のビット列は 0001 0101 1001 です。上位ビットは全てゼロなので省略します。これをキャストして byte b
に代入すると、下位8ビットしか保持されないので、 b
の値は 0101 1001 になります。これは十進数で 89 です。 345 は byte
型にキャストされると 89 になります。
オブジェクトである String
型の場合もキャストという概念が存在します。この場合は一般にオブジェクトのキャストとして説明される概念であり、基本データ型変数の型変換とは異なります。例えば、文字列 "10"
や String str
を int
型に変換したい場合は、 Integer.parseInt("10")
や Integer.parseInt(str)
のように、 Integer
クラスのメソッドを用います。