型変換について第2弾

# 初めに
[型変換について第1弾](https://qiita.com/pandausa/private/1029985a2627f70b9988)の続き
いくつか被る部分もあるがご容赦頂きたい。今回はプリミティブ型の型変換について見ていく。

## キャストとは
変数の型変換のことを言う。変数にはintやStringなどの様々な型があり、適切な型変換を行わないとコンパイルエラーや実行時エラーが発生する。

## int型→long型
これは代入で問題ない。
[参照](https://qiita.com/pandausa/private/1029985a2627f70b9988#int%E5%9E%8B%E3%81%8B%E3%82%89long%E5%9E%8B%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B)

## long型→int型
```ruby:Java(Main.java)
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型より扱えるデータ量が少ないためだ。この時に**キャスト演算子**を使って型変換をする必要がある。
```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		long l = 10L;
		int num = (int)l;
		System.out.println(num);
	}
}
```

結果
```
10
```

今度は問題なく実行できた、これまでは整数同士だったが小数同士だとどうなるだろうか。

## float型→double型
```ruby:Java(Main.java)
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型
```ruby:Java(Main.java)
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の方が扱える範囲が小さいためエラーになる。キャスト演算子を使ってみよう。

```ruby:Java(Main.java)
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型
```ruby:Java(Main.java)
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は持たないため、うまく変換ができなかったのだ。ここでもキャスト演算子を使ってみよう。
```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		double d = 10.2;
		int num =  (int)d;
		System.out.println(num);
	}
}
```

結果
```
10
```

問題無く実行できた、そして小数点の部分が自動的に削除された。
今度は文字同士で確認してみよう。

## char型→String型
```ruby:Java(Main.java)
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**を使って変換できる。

```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		char a = 'a';
		String str = String.valueOf(a);
		System.out.println(str);
	}
}
```

結果
```
a
```

## String型→char型
```ruby:Java(Main.java)
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文字を取得するようにする。

```ruby:Java(Main.java)
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)を使う