Javaに関する様々な情報をご紹介します。

2基本型の型変換とキャスト

Javaに関する様々な情報をご紹介します。

基本型の型変換とキャスト

Javaの変数には大きく分けて2つの型があります。基本型(プリミティブ型)と参照型です。基本型とは、boolean、 char、byte、short、int、long、float、doubleの8つの型を言います。参照型とはクラス型、インタフェース型、配列型を言います。

このページではある基本型の変数を他の基本型の変数に変換する方法について説明します。変換にはJava実行環境により暗黙的に実行される型変換と、プログラマが意識的に変換を行うキャストがあります。なお、参照型の変数の変換に関しては、クラス(参照型の型変換とキャスト)を参照してください。

基本型の型変換

基本型の型変換は拡大変換のルールで行われます。Java実行環境がデータ格納領域がより広い型への変換を要求した時に、暗黙的な型変換が行われます。

【型変換のルール】

変換元の基本型 型変換が可能な変更先の基本型
boolean なし
char int, long, float, double
byte short, int, long, float, double
short int, long, float, double
int long, float, double
long float, double
float double
double なし

以下ではどのようなときにJava実行環境から型変換が要求されるかについて説明します。

代入時の型変換

ある基本型の変数を、別の基本型の変数に代入する際に、型変換が行われます。変換は【型変換のルール】に従います

int x = 10;
double y;
y = x;

変数x(int型)を変数y(double型)に代入する時に、型変換が行われます。int型の変数xがdouble型に変換された後、代入が行われます。【型変換のルール】に沿っているため、プログラマは変換を意識する必要はありません。


int x = 10;
short y;
y = x;

変数x(int型)を変数y(short型)に代入することはできません。int型の変数xがshort型に変換されることはないためです。
実行結果はコンパイルエラーとなります。

メソッド呼び出し時の型変換

メソッドを呼び出す際、呼び出すメソッドの引数の型に要求されている型と異なる型を指定した場合、暗黙的な型変換が行われます。その際の型変換も【型変換のルール】に従います

short x = 10;
System.out.println(Integer.toString(x));

Integer.toStringはint型の引数を要求し、要求されたint型のデータを文字列に変換するメソッドです。この場合、short型の変数xを引数に指定しています。【型変換のルール】に従い、short型はint型に変換された後、メソッドが実行されるため、コンパイルエラーにはなりません。


double y = 20.25;
System.out.println(Integer.toString(y));

double型の変数yを引数に指定しています。
【型変換のルール】に沿わない(double型をint型に型変換できない)ため、実行結果はコンパイルエラーとなります。

算術演算時の型変換

算術演算子を用い算術演算を行う場合、暗黙的な型変換が行われます。算術演算時の型変換のルールは以下のようになります。

【算術演算子の型変換のルール】

算術演算子 ルール
単項演算子
(+, -, ~)
  • char, byte, short型の変数はint型に型変換されます。
  • 上記以外の型の変数は型変換は行われません。
二項演算子
(+, -, *, /, %, >>, >>>, <<, &, ^, | )
  • 一方の変数がdouble型の場合、もう一方の変数もdouble型に型変換されます。
  • 両方の変数にdouble型が含まれず、一方の変数がfloat型の場合、もう一方の変数もfloat型に型変換されます。
  • 両方の変数にdouble型、float型が含まれず、一方の変数がlong型の場合、もう一方の変数もlong型に型変換されます。
  • 両方の変数にdouble型、float型、long型が含まれない場合は、両方の型がint型に変換されます。

【例1】算術演算時の型変換における正常処理の例です。

short x = 10;
double y = 20.25;
double z = -x + y;  //(1)
System.out.println(z);  //(2)

解説1

  1. (1)変数x(sohrt型)は単項演算子(-)により、int型に変換されます。変数x(int型)と変数y(double型)は二項演算子(+)により、double型に型変換されます。演算結果が変数zに代入されます。
  2. (2)演算結果10.25が表示されます。

【例2】算術演算時の型変換におけるコンパイルエラーの例です。

short x = 10;
double y = 20.25;
int z = -x + y;  //(1)
System.out.println(z);

解説2

  1. (1)変数x(short型)は単項演算子(-)により、int型に変換されます。変数x(int型)と変数y(double 型)は二項演算子(+)により、double型に型変換されます。double型の演算結果をint型の変数zに代入できませんため、コンパイルエラーとなります。

基本型のキャスト

キャストとはプログラマが意識的に行う変換処理です。型変換では変数の変換処理を行えない場合に、キャストを使用します。キャストは変換したい型を( )で囲み、変換元の変数の前に指定することにより行います。

(変換したい型)変換元の変数;

【例3】キャストの例です。

int x = 10;
byte y = (byte)x;

int型の変数xをbyte型にキャストして、変数yに代入しています。
型変換ではint型の変数xをbyte型に変換することはできません。

キャストのルール

  • boolean型以外の基本型の変数を、他のboolean型以外の基本型の変数にキャストできます。キャストはデータ格納領域が広くなるキャストでも、データ格納領域が狭くなるキャストでもかまいません。データ格納領域が広くなるキャストの場合は、キャストを指定しなくても、必要な場合には、暗黙的な型変換が行われます。
  • boolean型はどの型へもキャストできません。

データ格納領域が狭くなるキャストを行う場合、変換先のデータが溢れる場合があります。

【例4】キャストにより、データの溢れが起こる場合の例です。

public class ExVar1 {
    public static void main(String[] args) {
        short x = 257;
        byte y = (byte)x;  //(1)byte型へキャスト
        System.out.println(y);  //(2)
    }
}

解説4

  1. (1)short型の変数xをbyte型へキャストし、byte型変数yへ代入します。
  2. (2)代入された変数yの値をprintlnメソッドで表示します。byte型の変数は1バイト(符号付で、-128~127)までしかデータを格納することができません。1バイトを超えるデータは切り捨てられます(データの溢れ)。そのため、想定される実行結果を得られません。
キャスト_データの溢れ

実行結果4

D:\JAVA>javac ExVar1.java
                                                
D:\JAVA>java ExVar1
1

D:\JAVA>

2基本型の型変換とキャスト