Java Language
タイプ変換
サーチ…
構文
- TargetType target =(SourceType)source;
非数値プリミティブキャスティング
boolean
型は他のプリミティブ型との間でキャストできません。
Unicodeで指定されたコードポイントマッピングを使用すると、任意の数値型との間でchar
をキャストできます。 char
はメモリ内で符号なし16ビット整数値(2バイト)として表されるため、 byte
(1バイト)へのキャストはこれらのビットのうち8ビットを削除します(これはASCII文字では安全です)。 Character
クラスのユーティリティメソッドは、 int
(4バイト)を使用してコードポイント値との間でやりとりしますが、Unicodeコードポイントを格納するにはshort
(2バイト)でも十分です。
int badInt = (int) true; // Compiler error: incompatible types
char char1 = (char) 65; // A
byte byte1 = (byte) 'A'; // 65
short short1 = (short) 'A'; // 65
int int1 = (int) 'A'; // 65
char char2 = (char) 8253; // ‽
byte byte2 = (byte) '‽'; // 61 (truncated code-point into the ASCII range)
short short2 = (short) '‽'; // 8253
int int2 = (int) '‽'; // 8253
数値プリミティブキャスティング
数値プリミティブは2つの方法でキャストできます。 暗黙のキャストは、ソースタイプのターゲットタイプの範囲が狭い場合に発生します。
//Implicit casting
byte byteVar = 42;
short shortVar = byteVar;
int intVar = shortVar;
long longVar = intvar;
float floatVar = longVar;
double doubleVar = floatVar;
明示的キャスティングは、ソース・タイプの方がターゲット・タイプよりも大きい場合に実行する必要があります。
//Explicit casting
double doubleVar = 42.0d;
float floatVar = (float) doubleVar;
long longVar = (long) floatVar;
int intVar = (int) longVar;
short shortVar = (short) intVar;
byte byteVar = (byte) shortVar;
浮動小数点プリミティブ( float
、 double
)を整数プリミティブにキャストするとき、その数値は切り捨てられます。
オブジェクトキャスト
プリミティブと同様に、オブジェクトは明示的にも暗黙的にもキャストできます。
暗黙のキャストは、ソース・タイプがターゲット・タイプ(スーパークラスまたはインターフェースへのキャスト)を拡張または実装するときに発生します。
明示的なキャストは、ソース・タイプがターゲット・タイプ(サブタイプにキャスト)によって拡張または実装されている場合に実行する必要があります。これにより、キャストされるオブジェクトがターゲットタイプ(またはターゲットのサブタイプ)でない場合に、ランタイム例外( ClassCastException
)が生成される可能性があります。
Float floatVar = new Float(42.0f);
Number n = floatVar; //Implicit (Float implements Number)
Float floatVar2 = (Float) n; //Explicit
Double doubleVar = (Double) n; //Throws exception (the object is not Double)
基本的な数値昇格
static void testNumericPromotion() {
char char1 = 1, char2 = 2;
short short1 = 1, short2 = 2;
int int1 = 1, int2 = 2;
float float1 = 1.0f, float2 = 2.0f;
// char1 = char1 + char2; // Error: Cannot convert from int to char;
// short1 = short1 + short2; // Error: Cannot convert from int to short;
int1 = char1 + char2; // char is promoted to int.
int1 = short1 + short2; // short is promoted to int.
int1 = char1 + short2; // both char and short promoted to int.
float1 = short1 + float2; // short is promoted to float.
int1 = int1 + int2; // int is unchanged.
}
instanceofを使用してオブジェクトをキャストできるかどうかのテスト
Javaは、オブジェクトが特定の型かその型のサブクラスかをテストするためにinstanceof
演算子を提供しinstanceof
。プログラムは、そのオブジェクトをキャストするか、キャストしないかを選択できます。
Object obj = Calendar.getInstance();
long time = 0;
if(obj instanceof Calendar)
{
time = ((Calendar)obj).getTime();
}
if(obj instanceof Date)
{
time = ((Date)obj).getTime(); // This line will never be reached, obj is not a Date type.
}