JavaA2Z

KAB-studio > プログラミング > JavaA2Z > キャストとは

キャスト

日本語 鋳型にはめる
英語 cast
ふりがな きゃすと
フリガナ キャスト

解説

を変換すること。
一応、「演算子」の一種。
変数A = (変数Aの)変数B;」のように、変数の前に小カッコ「(」と「)」で「変換先の」を記述することで、「変数B」に格納された値が「変換先の」に型変換された値が返されて、「変数A」に格納される。
その際、「変数B」の中の値に影響は与えない。あくまで「変数Bに格納されている値のコピー」のが変換されるだけである。
 
キャストには「暗黙的キャスト」と「明示的キャスト」がある。
前述した「変数A = (変数Aの)変数B;」という形式が「明示的キャスト」である。
対して、「変数A = 変数B;」という形式が「暗黙的キャスト」である。
つまり、暗黙的キャストは、見た目的にはキャストしていない。ただし、内部的には型変換が必要なため、キャストがわれている。つまり、見えない所でキャストがわれているということである。
 
プリミティブ型におけるキャストと、クラスにおけるキャストは全く別物と考えた方が良いだろう。
 
プリミティブ型のキャストの場合、整数浮動小数点booleanの3通りに分けられる。
整数の場合、サイズが小さい方から大きい方へは、暗黙的キャストが自動的われるため、特別な記述は必要ない。
逆に、サイズが大きい方から小さい方へは、明示的にキャストが必要となる。ただし、当然サイズが小さくなるため、キャスト前の変数に、キャスト後のよりも大きな値が入っていた場合には値は不正になる。
浮動小数点も同様に、サイズが小さい方から大きい方へは自動的にキャストされ、逆に大きい方から小さい方へは明示的にキャストする必要がある。こちらもサイズを無理矢理小さくするため、特に仮数部が大きく削られ、誤差が大きく現れてしまう。
サイズが小さい方から大きい方へのキャストを「ワイドニング変換」、逆に大きい方から小さい方へのキャストを「ナローイング変換」と呼ぶ。
 
整数から浮動小数点へはサイズに関係なく自動的にキャストされる。
逆に、浮動小数点から整数へは明示的にキャストする必要があり、その際、小数点以下は切り捨てられる。逆に、浮動小数点の小数点以下をわざと削りたい場合のテクニックのひとつとして使用できる。
 
booleanは、あらゆるにキャストすることができない特殊なである。booleanから他の、また他のからbooleanへ変換することはできない。
 
クラスの場合、全く関係のないクラスや、プリミティブ型とのキャストは双方向で不可能である。
また、Javaでは参照でもその参照値を直接取得したり格納することはできないため、任意の整数値を参照変数にセットしたりといったことはできない。
クラスにおいてキャストが可能なのは、継承関係にあるクラスとの間でのみである。継承関係のうち、スーパークラスへのキャストは「アップキャスト」、サブクラスへのキャストは「ダウンキャスト」と呼ばれる。プリミティブ型のキャストと全く異なる性質のキャストであり、ポリモーフィズムに関係する重要な機能である。
 
明示的キャストが必要な場面は、「一応変換ができるけど、変換後にうまくいくとは限らない」場合である。つまり、危険が伴うため、その「警告」という意味で、明示的キャストが必要となっている。
よって、キャストを記述する時には必ず「これは本当にキャストしなければならないのか」ということを確認するべきだろう。往々にして、不必要なキャストはバグの温床となりうるものであり、優れたプログラムは自ずとキャストの少ないプログラムとなる。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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 へキャストすることはできません。
        // 継承関係がある場合にはキャスト可能。
        // これについては「アップキャスト」「ダウンキャスト」を参照してください。
    }
}
// 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 へキャストすることはできません。
        // 継承関係がある場合にはキャスト可能。
        // これについては「アップキャスト」「ダウンキャスト」を参照してください。
    }
}

この単語を含むページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/20
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。