【Java】自動型変換とは

Javaは、変数を宣言するとき同時にデータ型を指定する必要があります。

通常、宣言したデータ型にあったリテラルを代入する必要があります。

しかし、例外としてJavaの自動型変換によって、データ型と違うリテラルを代入してもエラーにならない場合があります。

本記事では、Javaの自動型変換について紹介します。

自動型変換とは

ある変数を別の型の変数やリテラルに代入した際、自動的にデータ型を変換するもの

代入時の型変換

以下のような大小関係があり、大きいデータ型は、小さいデータ型を代入することができます。

小さい:byte型→short型→int型→long型→float型→double型:大きい

long a = 123; // long型変数にint型を代入
float b = 456L; // float型変数にlong型を代入
double c = 78.9F; // double型変数にfloat型を代入

逆に以下のような小さいデータ型に大きいデータ型を代入するとエラーになります。

例(Error)

int a = 123L; // int型変数にlong型を代入
long b = 45.6F; // long型変数にfloat型を代入
float c = 78.9; // float型変数にdouble型を代入

小さいデータ型に大きいデータ型をどうしても代入したい場合、キャストをすることでエラーにならなくなります。

int a = (int)123L; 
long b = (long)45.6F; 
float c = (float)78.9; 

演算時の自動型変換

左からみて2つのデータ型が異なる場合、以下のようなルールのもと、自動的に型変換されます。

数値型同士の演算時のルール

  • 異なるデータ型を比較して、大きいデータ型に変換して演算される
  • byte型やshort型の場合、int型に変換されて演算される
  • 3つ以上のリテラルを演算する場合、左から演算する
  • ()がある場合、そちらから優先して演算する

大きいデータ型、小さいデータ型は、代入時の自動変換と同じです。

double a = 5.0 + 2; // 2をdouble型に変換
long b = 5 + 2L; // 5をlong型に変換
float c = 5.0F + 2; // 2をfloat型に変換
double d = 5 + 2L + 1.0; // 5をlong型に変換し、5L+2L=7Lとし、その後double型に変換
double e = 5.0 + 2.0F + 1; // 2.0Fをdouble型に変換し、5.0+2.0=7.0とし、その後1をdouble型に変換 

文字列を含む演算の場合、String型に変換する

String age = "my age is" + 20; // 20をString型に変換
// "my age is 20"
String height = "my height is" + 100 + 70; // 100をString型に変換し、その後70をString型に変換
// "my height is 10070"
String height = "my height is" + (100 + 70); // 100+70=170とし、String型に変換
// "my height is 170"