パンくず
書籍 パーフェクトJava
型変換
概要
Javaの型変換について
Javaの型変換型(縮小変換)
数値型は、値の範囲が収まる場合にキャストを利用することで
型変換を行うことが出来ます。
値が収まらない場合はオーバーフローを起こすため注意が必要です。
サンプルコード
package perfect.number; public class Perfect3_3_1 { /** * @param args */ public static void main(String[] args) { byte by; short sh = 1; by = (byte) sh; // => 値が収まる範囲なら問題なくキャスト可能 System.out.println(by); // => 1 System.out.println(Byte.MAX_VALUE); // => 127 short byteMaxPlus1 = Byte.MAX_VALUE + 1; // => 128(byteの最大値+1) by = (byte) byteMaxPlus1; // => 値が収まらないためオーバーフローする System.out.println(by); // => 結果:-128 } }
サンプルコード
package perfect.number; public class Perfect3_3_2 { /** * @param args */ public static void main(String[] args) { short sh1 = 1; short sh2 = 2; // => long以外の数値演算は全てintとして計算されるためキャストが必要 short shortSum = (short) (sh1 + sh2); System.out.println(shortSum); int in = 1; long lo = 2L; // => longを含む数値演算は全てlongとして計算されるためキャストが必要 int inSum = (int) (in + lo); System.out.println(inSum); } }
リテラルの変換
リテラルの変換は以下のルールで行われます
リテラルの内容 | 縮小変換結果 |
---|---|
intのリテラル(範囲内) | キャストなしで自動変換 |
intのリテラル(範囲外) | キャストなしだとコンパイルエラー。キャストすれば動作するがオーバーフロー |
intのリテラル(メソッドの引数) | 範囲内の場合もキャストが必要 |
longのリテラル | コンパイルエラー |
サンプルコード
package perfect.number; public class Perfect3_3_3 { /** * @param args */ public static void main(String[] args) { byte by = 127; System.out.println(by); // => 127 // byte byOver = 128; => コンパイルエラー byte byOver = (byte) 128;// => キャストでコンパイルエラーは回避したがオーバーフロー System.out.println(byOver); // => -128 // outputByte(127); => コンパイルエラー outputByte((byte) 127); // => キャストに成功し、127を出力 // byte byLong = 1L; // => コンパイルエラー } private static void outputByte(byte by) { System.out.println(by); } }