キャスト
日本語 | 鋳型にはめる |
英語 | cast |
ふりがな | きゃすと |
フリガナ | キャスト |
型を変換すること。
一応、「演算子」の一種。
「変数A = (変数Aの型)変数B;」のように、変数の前に小カッコ「(」と「)」で「変換先の型」を記述することで、「変数B」に格納された値が「変換先の型」に型変換された値が返されて、「変数A」に格納される。
その際、「変数B」の中の値に影響は与えない。あくまで「変数Bに格納されている値のコピー」の型が変換されるだけである。
キャストには「暗黙的キャスト」と「明示的キャスト」がある。
前述した「変数A = (変数Aの型)変数B;」という形式が「明示的キャスト」である。
対して、「変数A = 変数B;」という形式が「暗黙的キャスト」である。
つまり、暗黙的キャストは、見た目的にはキャストしていない。ただし、内部的には型変換が必要なため、キャストが行われている。つまり、見えない所でキャストが行われているということである。
プリミティブ型におけるキャストと、クラスにおけるキャストは全く別物と考えた方が良いだろう。
プリミティブ型のキャストの場合、整数型、浮動小数点型、boolean型の3通りに分けられる。
整数型の場合、サイズが小さい方から大きい方へは、暗黙的キャストが自動的に行われるため、特別な記述は必要ない。
逆に、サイズが大きい方から小さい方へは、明示的にキャストが必要となる。ただし、当然サイズが小さくなるため、キャスト前の変数に、キャスト後の型よりも大きな値が入っていた場合には値は不正になる。
浮動小数点型も同様に、サイズが小さい方から大きい方へは自動的にキャストされ、逆に大きい方から小さい方へは明示的にキャストする必要がある。こちらもサイズを無理矢理小さくするため、特に仮数部が大きく削られ、誤差が大きく現れてしまう。
サイズが小さい方から大きい方へのキャストを「ワイドニング変換」、逆に大きい方から小さい方へのキャストを「ナローイング変換」と呼ぶ。
整数型から浮動小数点型へはサイズに関係なく自動的にキャストされる。
逆に、浮動小数点型から整数型へは明示的にキャストする必要があり、その際、小数点以下は切り捨てられる。逆に、浮動小数点型の小数点以下をわざと削りたい場合のテクニックのひとつとして使用できる。
boolean型は、あらゆる型にキャストすることができない特殊な型である。boolean型から他の型、また他の型からboolean型へ変換することはできない。
クラスの場合、全く関係のないクラスや、プリミティブ型とのキャストは双方向で不可能である。
また、Javaでは参照型でもその参照値を直接取得したり格納することはできないため、任意の整数値を参照型変数にセットしたりといったことはできない。
クラスにおいてキャストが可能なのは、継承関係にあるクラスとの間でのみである。継承関係のうち、スーパークラスへのキャストは「アップキャスト」、サブクラスへのキャストは「ダウンキャスト」と呼ばれる。プリミティブ型のキャストと全く異なる性質のキャストであり、ポリモーフィズムに関係する重要な機能である。
明示的キャストが必要な場面は、「一応変換ができるけど、変換後にうまくいくとは限らない」場合である。つまり、危険が伴うため、その「警告」という意味で、明示的キャストが必要となっている。
よって、キャストを記述する時には必ず「これは本当にキャストしなければならないのか」ということを確認するべきだろう。往々にして、不必要なキャストはバグの温床となりうるものであり、優れたプログラムは自ずとキャストの少ないプログラムとなる。
一応、「演算子」の一種。
「変数A = (変数Aの型)変数B;」のように、変数の前に小カッコ「(」と「)」で「変換先の型」を記述することで、「変数B」に格納された値が「変換先の型」に型変換された値が返されて、「変数A」に格納される。
その際、「変数B」の中の値に影響は与えない。あくまで「変数Bに格納されている値のコピー」の型が変換されるだけである。
キャストには「暗黙的キャスト」と「明示的キャスト」がある。
前述した「変数A = (変数Aの型)変数B;」という形式が「明示的キャスト」である。
対して、「変数A = 変数B;」という形式が「暗黙的キャスト」である。
つまり、暗黙的キャストは、見た目的にはキャストしていない。ただし、内部的には型変換が必要なため、キャストが行われている。つまり、見えない所でキャストが行われているということである。
プリミティブ型におけるキャストと、クラスにおけるキャストは全く別物と考えた方が良いだろう。
プリミティブ型のキャストの場合、整数型、浮動小数点型、boolean型の3通りに分けられる。
整数型の場合、サイズが小さい方から大きい方へは、暗黙的キャストが自動的に行われるため、特別な記述は必要ない。
逆に、サイズが大きい方から小さい方へは、明示的にキャストが必要となる。ただし、当然サイズが小さくなるため、キャスト前の変数に、キャスト後の型よりも大きな値が入っていた場合には値は不正になる。
浮動小数点型も同様に、サイズが小さい方から大きい方へは自動的にキャストされ、逆に大きい方から小さい方へは明示的にキャストする必要がある。こちらもサイズを無理矢理小さくするため、特に仮数部が大きく削られ、誤差が大きく現れてしまう。
サイズが小さい方から大きい方へのキャストを「ワイドニング変換」、逆に大きい方から小さい方へのキャストを「ナローイング変換」と呼ぶ。
整数型から浮動小数点型へはサイズに関係なく自動的にキャストされる。
逆に、浮動小数点型から整数型へは明示的にキャストする必要があり、その際、小数点以下は切り捨てられる。逆に、浮動小数点型の小数点以下をわざと削りたい場合のテクニックのひとつとして使用できる。
boolean型は、あらゆる型にキャストすることができない特殊な型である。boolean型から他の型、また他の型からboolean型へ変換することはできない。
クラスの場合、全く関係のないクラスや、プリミティブ型とのキャストは双方向で不可能である。
また、Javaでは参照型でもその参照値を直接取得したり格納することはできないため、任意の整数値を参照型変数にセットしたりといったことはできない。
クラスにおいてキャストが可能なのは、継承関係にあるクラスとの間でのみである。継承関係のうち、スーパークラスへのキャストは「アップキャスト」、サブクラスへのキャストは「ダウンキャスト」と呼ばれる。プリミティブ型のキャストと全く異なる性質のキャストであり、ポリモーフィズムに関係する重要な機能である。
明示的キャストが必要な場面は、「一応変換ができるけど、変換後にうまくいくとは限らない」場合である。つまり、危険が伴うため、その「警告」という意味で、明示的キャストが必要となっている。
よって、キャストを記述する時には必ず「これは本当にキャストしなければならないのか」ということを確認するべきだろう。往々にして、不必要なキャストはバグの温床となりうるものであり、優れたプログラムは自ずとキャストの少ないプログラムとなる。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// int型からlong型へ変換します。
int i = 100;
long l = i;
System.out.println( l );
// 100
// 小さい方から大きい方へは、暗黙的にキャストできます。
// サイズが大きい方から小さい方へは、暗黙的なキャストは
// できません。
// i = l;
// コンパイルエラー:
// 型の不一致: long から int には変換できません。
// 明示的にキャストすればできます。
i = (int)l;
System.out.println( i );
// 100
// ただし、無理矢理格納するので値は変わってしまいます。
l = Long.MAX_VALUE;
i = (int)l;
System.out.println( i );
// -1
// 浮動小数点の場合。
float f = 200.9F;
double d = f;
System.out.println( d );
// 200.89999389648438
// 小さい方から大きい方へは、暗黙的にキャストできます。
// ただし、仮数部のサイズが大きく異なるため、誤差が
// 発生しやすくなります。
// サイズが大きい方から小さい方へは、暗黙的なキャストは
// できません。
// f = d;
// コンパイルエラー:
// 型の不一致: double から float には変換できません。
// 明示的にキャストすればできます。
f = (float)d;
System.out.println( f );
// 200.9
// そもそも、浮動小数点リテラルはデフォルトでdouble型で、
// それだとコンパイルエラーが出るため「200.9F」と
// 末尾に「F」を付けています。
// 整数型から浮動小数点型へは暗黙的にキャストされます。
// 一見、なにもせずに格納されているように見えますが、
// 内部的にはキャストが行われています。
i = 200;
d = i;
System.out.println( d );
// 200.0
// 浮動小数点型から整数型へは暗黙的にはキャストできません。
// i = d;
// コンパイルエラー:
// 型の不一致: double から int には変換できません。
// 明示的にキャストすればできます。
// この際、小数点以下の切り捨てが行われます。
i = (int)d;
System.out.println( i );
// 200
// 浮動小数点と整数とではビットの構造が全く異なるので、
// こういう変換処理が組み込まれていると考えましょう。
// boolean とはどの型もキャストできません。
boolean b = true;
// i = (int)b;
// コンパイルエラー:
// boolean から int へキャストすることはできません。
// b = (boolean)i;
// コンパイルエラー:
// int から boolean へキャストすることはできません。
// クラスとプリミティブ型もキャストできません。
Integer integer = new Integer( 300 );
// i = (int)integer;
// コンパイルエラー:
// Integer から int へキャストすることはできません。
// integer = (Integer)i;
// int から Integer へキャストすることはできません。
// 全く関係のないクラスへもキャストすることはできません。
// Long aLong = (Long)integer;
// コンパイルエラー:
// Integer から Long へキャストすることはできません。
// 継承関係がある場合にはキャスト可能。
// これについては「アップキャスト」「ダウンキャスト」を参照してください。
}
}
public class Sample
{
public static void main( String[] args )
{
// int型からlong型へ変換します。
int i = 100;
long l = i;
System.out.println( l );
// 100
// 小さい方から大きい方へは、暗黙的にキャストできます。
// サイズが大きい方から小さい方へは、暗黙的なキャストは
// できません。
// i = l;
// コンパイルエラー:
// 型の不一致: long から int には変換できません。
// 明示的にキャストすればできます。
i = (int)l;
System.out.println( i );
// 100
// ただし、無理矢理格納するので値は変わってしまいます。
l = Long.MAX_VALUE;
i = (int)l;
System.out.println( i );
// -1
// 浮動小数点の場合。
float f = 200.9F;
double d = f;
System.out.println( d );
// 200.89999389648438
// 小さい方から大きい方へは、暗黙的にキャストできます。
// ただし、仮数部のサイズが大きく異なるため、誤差が
// 発生しやすくなります。
// サイズが大きい方から小さい方へは、暗黙的なキャストは
// できません。
// f = d;
// コンパイルエラー:
// 型の不一致: double から float には変換できません。
// 明示的にキャストすればできます。
f = (float)d;
System.out.println( f );
// 200.9
// そもそも、浮動小数点リテラルはデフォルトでdouble型で、
// それだとコンパイルエラーが出るため「200.9F」と
// 末尾に「F」を付けています。
// 整数型から浮動小数点型へは暗黙的にキャストされます。
// 一見、なにもせずに格納されているように見えますが、
// 内部的にはキャストが行われています。
i = 200;
d = i;
System.out.println( d );
// 200.0
// 浮動小数点型から整数型へは暗黙的にはキャストできません。
// i = d;
// コンパイルエラー:
// 型の不一致: double から int には変換できません。
// 明示的にキャストすればできます。
// この際、小数点以下の切り捨てが行われます。
i = (int)d;
System.out.println( i );
// 200
// 浮動小数点と整数とではビットの構造が全く異なるので、
// こういう変換処理が組み込まれていると考えましょう。
// boolean とはどの型もキャストできません。
boolean b = true;
// i = (int)b;
// コンパイルエラー:
// boolean から int へキャストすることはできません。
// b = (boolean)i;
// コンパイルエラー:
// int から boolean へキャストすることはできません。
// クラスとプリミティブ型もキャストできません。
Integer integer = new Integer( 300 );
// i = (int)integer;
// コンパイルエラー:
// Integer から int へキャストすることはできません。
// integer = (Integer)i;
// int から Integer へキャストすることはできません。
// 全く関係のないクラスへもキャストすることはできません。
// Long aLong = (Long)integer;
// コンパイルエラー:
// Integer から Long へキャストすることはできません。
// 継承関係がある場合にはキャスト可能。
// これについては「アップキャスト」「ダウンキャスト」を参照してください。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // int型からlong型へ変換します。 int i = 100; long l = i; System.out.println( l ); // 100 // 小さい方から大きい方へは、暗黙的にキャストできます。 // サイズが大きい方から小さい方へは、暗黙的なキャストは // できません。 // i = l; // コンパイルエラー: // 型の不一致: long から int には変換できません。 // 明示的にキャストすればできます。 i = (int)l; System.out.println( i ); // 100 // ただし、無理矢理格納するので値は変わってしまいます。 l = Long.MAX_VALUE; i = (int)l; System.out.println( i ); // -1 // 浮動小数点の場合。 float f = 200.9F; double d = f; System.out.println( d ); // 200.89999389648438 // 小さい方から大きい方へは、暗黙的にキャストできます。 // ただし、仮数部のサイズが大きく異なるため、誤差が // 発生しやすくなります。 // サイズが大きい方から小さい方へは、暗黙的なキャストは // できません。 // f = d; // コンパイルエラー: // 型の不一致: double から float には変換できません。 // 明示的にキャストすればできます。 f = (float)d; System.out.println( f ); // 200.9 // そもそも、浮動小数点リテラルはデフォルトでdouble型で、 // それだとコンパイルエラーが出るため「200.9F」と // 末尾に「F」を付けています。 // 整数型から浮動小数点型へは暗黙的にキャストされます。 // 一見、なにもせずに格納されているように見えますが、 // 内部的にはキャストが行われています。 i = 200; d = i; System.out.println( d ); // 200.0 // 浮動小数点型から整数型へは暗黙的にはキャストできません。 // i = d; // コンパイルエラー: // 型の不一致: double から int には変換できません。 // 明示的にキャストすればできます。 // この際、小数点以下の切り捨てが行われます。 i = (int)d; System.out.println( i ); // 200 // 浮動小数点と整数とではビットの構造が全く異なるので、 // こういう変換処理が組み込まれていると考えましょう。 // boolean とはどの型もキャストできません。 boolean b = true; // i = (int)b; // コンパイルエラー: // boolean から int へキャストすることはできません。 // b = (boolean)i; // コンパイルエラー: // int から boolean へキャストすることはできません。 // クラスとプリミティブ型もキャストできません。 Integer integer = new Integer( 300 ); // i = (int)integer; // コンパイルエラー: // Integer から int へキャストすることはできません。 // integer = (Integer)i; // int から Integer へキャストすることはできません。 // 全く関係のないクラスへもキャストすることはできません。 // Long aLong = (Long)integer; // コンパイルエラー: // Integer から Long へキャストすることはできません。 // 継承関係がある場合にはキャスト可能。 // これについては「アップキャスト」「ダウンキャスト」を参照してください。 } }
「みだし」に含まれているページ
「解説」に含まれているページ
- (
- /演算子
- ArrayStoreException
- byte
- C++言語
- CharArrayReader
- ClassCastException
- DOM
- HttpURLConnection
- InputStream
- Iterator
- java.sql.Date
- Map
- Node
- Object
- OutputStream
- short
- StringReader
- 「F」
- アップキャスト
- アンボクシング変換
- インスタンス
- オートボクシング
- キャスト
- キャスト演算子
- サブクラス
- スーパークラス
- ダウンキャスト
- ナローイング変換
- プリミティブ型
- ボクシング変換
- ポリモーフィズム
- メソッド
- メソッド呼び出し変換
- ワイドニング変換
- 丸め誤差
- 代入変換
- 型
- 型変換
- 定数式
- 数値格上げ変換
- 明示的
- 暗黙的
- 演算子
- 配列
「サンプルプログラムとか」に含まれているページ
- (
- )
- /演算子
- abstract
- byte
- Byte
- char
- CharArrayReader
- compareTo
- DOM
- for
- implements
- interface
- Node
- Object
- short
- Short
- StringReader
- XML
- 「L」
- アップキャスト
- アンボクシング変換
- インターフェイス
- オブジェクト指向
- オートボクシング
- キャスト
- キャスト演算子
- コンパイルタイムエラー
- ダウンキャスト
- ナローイング変換
- ボクシング変換
- ポリモーフィズム
- メソッド呼び出し変換
- ワイドニング変換
- 丸め誤差
- 乱数
- 代入変換
- 型
- 型変換
- 定数式
- 抽象クラス
- 抽象メソッド
- 明示的
- 暗黙的