初めに
型変換について第1弾の続き
いくつか被る部分もあるがご容赦頂きたい。今回はプリミティブ型の型変換について見ていく。
キャストとは
変数の型変換のことを言う。変数にはintやStringなどの様々な型があり、適切な型変換を行わないとコンパイルエラーや実行時エラーが発生する。
int型→long型
これは代入で問題ない。
参照
long型→int型
public class Main {
public static void main(String[] args) {
long l = 10L;
int num = l;
System.out.println(num);
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
型の不一致: long から int には変換できません
at Main.main(Main.java:4)
こちらはエラーになる。int型はlong型より扱えるデータ量が少ないためだ。この時にキャスト演算子を使って型変換をする必要がある。
public class Main {
public static void main(String[] args) {
long l = 10L;
int num = (int)l;
System.out.println(num);
}
}
結果
10
今度は問題なく実行できた、これまでは整数同士だったが小数同士だとどうなるだろうか。
float型→double型
public class Main {
public static void main(String[] args) {
float f = 1.2F;
double d = f;
System.out.println(d);
}
}
結果
1.2000000476837158
doubleの方がfloatより扱える範囲が大きいため、こちらは問題なく実行できた。
double型→float型
public class Main {
public static void main(String[] args) {
double d = 1.2;
float f = d;
System.out.println(f);
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
型の不一致: double から float には変換できません
at Main.main(Main.java:4)
こちらもfloatの方が扱える範囲が小さいためエラーになる。キャスト演算子を使ってみよう。
public class Main {
public static void main(String[] args) {
double d = 1.2;
float f = (float)d;
System.out.println(f);
}
}
結果
1.2
今度は実行できた。では小数と整数の変換はどうなるだろうか。
int型→double型
public class Main {
public static void main(String[] args) {
int num = 10;
double d = num;
System.out.println(d);
}
}
結果
10.0
``
整数から小数は問題なく実行できた。
## double型→int型
```ruby:Java(Main.java)
public class Main {
public static void main(String[] args) {
double d = 10.2;
int num = d;
System.out.println(num);
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
型の不一致: double から int には変換できません
at Main.main(Main.java:4)
エラーになってしまった。doubleは小数点を持つがintは持たないため、うまく変換ができなかったのだ。ここでもキャスト演算子を使ってみよう。
public class Main {
public static void main(String[] args) {
double d = 10.2;
int num = (int)d;
System.out.println(num);
}
}
結果
10
問題無く実行できた、そして小数点の部分が自動的に削除された。
今度は文字同士で確認してみよう。
char型→String型
public class Main {
public static void main(String[] args) {
char a = 'a';
String str = a;
System.out.println(str);
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
型の不一致: char から String には変換できません
at Main.main(Main.java:4)
エラーになってしまった、実はキャスト演算子を使ってもエラーになる。ここではString.valueOfを使って変換できる。
public class Main {
public static void main(String[] args) {
char a = 'a';
String str = String.valueOf(a);
System.out.println(str);
}
}
結果
a
String型→char型
public class Main {
public static void main(String[] args) {
String str = "hello";
char a = str;
System.out.println(a);
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
型の不一致: String から char には変換できません
at Main.main(Main.java:4)
これは想像しやすいかもしれない、char型は1文字だけ格納するのでString型と扱う範囲が異なる。この場合は**CharAt(index)**を使用して1文字を取得するようにする。
public class Main {
public static void main(String[] args) {
String str = "hello";
char a = str.charAt(1);
System.out.println(a);
}
}
結果
e
index=1の文字はeなので、eを取り出すことができた。
まとめ
- int型→long型やint型→double型など、より大きい範囲を扱う型に変換する時は代入のみでOK
- long型→int型やdouble型→int型など、より小さい範囲を扱う型に変換する時はキャスト演算子を使う。この時小数→整数への変換で小数点以下が失われる
- char型→String型の変換ではString.valueOfを使う
- String型→char型への文字取り出しはCharAt(index)を使う