Chapter 17

Java データ型の型変換

おでん
おでん
2021.08.23に更新

基本データ型の型変換

基本データ型(プリミティブ型)の変数は、変換可能な範囲内でデータ型を変換することができます。
その変換の方法は以下の2種類あります。

  1. 暗黙的な型変換
  2. 明示的なキャスト変換

あらためて、基本データ型は以下の8つを指します。

  1. byte
  2. short
  3. int
  4. long
  5. float
  6. double
  7. char
  8. boolean

1. 暗黙的な型変換

暗黙的な型変換は以下のような場合に行われます。

  • 代入時
  • メソッドの引数に指定し呼び出した時
  • メソッドの戻り値に指定し呼び出した時

それぞれの場合の例を挙げます。

代入時

short x = 10;
int y = x;
System.out.println(y);

「10」と出力され、変数yにはint型の「10」が格納されており、暗黙的に「short型」から「int型」に変換されています。

メソッドの引数に指定し呼び出した時

メソッド定義
public static void method(double x){
  System.out.println(x);
}
メソッド呼び出し
int i = 10;
method(i);

「10.0」と出力され、「int型」から「double型」へ暗黙的に変換されています。

メソッドの戻り値に指定し呼び出した時

メソッド定義
int method(){
  int i = 10;
  return i;
}
メソッド呼び出し
double x = method();
System.out.println(x);

同じように「10.0」と出力され、「int型」から「double型」へ暗黙的に変換されています。

型変換のルール

上記で見てきた暗黙的な型変換にはルールがあります。
それは、下記の図で左側の型から右側の型へ変換できるということです。

data

つまり、「short型」から「int型」は左側から右側への変換なので可能です。
同様に、「int型」から「double型」も変換できました。
逆に、右側から左側への暗黙的な型変換はできません。

例えば、以下のようにしてみるとコンパイルエラーとなります。

int x = 10;
short y = x;   //コンパイルエラー

「int型」から「short型」は右側から左側への変換だからです。

2. 明示的なキャスト変換

暗黙的な型変換がある一方で、明示的に型変換を行うこともできます。
つまり、先程の図で右側から左側への型変換ができます。
その場合は 「()キャスト演算子」 を使用します。
以下の記述でキャストを行えます。

(変換後の型)値

例を挙げていきます。

代入時

double a = 10.5;
int b = (int)a;
System.out.println(b);

「10」と出力され、「double型」から「int型」へ変換されています。

メソッドの引数に指定し呼び出した時

メソッド定義
public static void method(int x){
  System.out.println(x);
}
メソッド呼び出し
double i = 10.5;
method((int)i);

「10」と出力され、「double型」から「int型」へ変換されています。

メソッドの戻り値に指定し呼び出した時

メソッド定義
public static int method2(){
  double i = 10.5;
  return (int)i;
}
メソッド呼び出し
int d = method2();
System.out.println(d);

「10」と出力され、「double型」から「int型」へ変換されています。

参照データ型の型変換

参照データ型もデータ型を変換することができます。
その変換の方法は以下の2種類あります。

  1. 暗黙的な型変換
  2. 明示的なキャスト変換

基本データ型と同じですね。
参照データ型も型変換のルールがあります。
クラス型とクラス型に継承の関係がある、もしくは、実装の関係があることが必要です。
図にすると以下のような型変換のルールになっています。

change

1. 暗黙的な型変換

以下、参照データ型の暗黙的な型変換の例です。

Ab.java
abstract class Ab {
  int x = 10;
  int y = 20;
  public abstract void method1();
  public void method2(){
    System.out.println(y);
  };
}
Sub.java
public class Sub extends Ab {
  public void method1(){
    System.out.println(x);
  }
}
SubMain.java
public class SubMain {
  public static void main(String[] args){
    Ab a = new Sub();
    a.method1();
    a.method2();
  }
}
結果
10
20

「SubMain.java」内で「Ab a = new Sub();」の記述があります。
これは、「Ab型の変数a」に「Sub型の値」を代入しています。
つまり、サブクラスの型からスーパークラスの型への変換が暗黙的に行われているということです。

2. 明示的なキャスト変換

続いて、明示的なキャスト変換です。
こちらも基本データ型と同じ書式でキャストが行えます。

(変換後の型)インスタンスのアドレス値を持つ変数名

上記の例で行ってみます。

SubMain.java
public class SubMain {
  public static void main(String[] args){
    Ab a = new Sub();
    Sub sub = (Sub)a;
    sub.method1();
    sub.method2();
  }
}
結果
10
20

「Sub sub = (Sub)a;」の記述で、「Ab型の変数a」を「Sub型の変数sub」に型変換ができています。