Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

書籍 パーフェクトJava | 型変換

パンくず

書籍 パーフェクト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
  }
}

Javaの型変換(昇格)

Javaの数値演算は以下のルールで自動的に広い型への拡大変換が行われます。
算術演算にlongを含む場合=>long型へ
それ以外の場合=>int型へ

サンプルコード

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);
  }
}