はじめに
Javaを学び始めると、ほぼ必ずぶつかるのが「型変換」の壁です。
・なぜコンパイルエラーになるの?
・同じように見えるのに、なぜ片方だけ動くの?
・int と Integer の違いって何?
・null はなぜ入らないの?
私自身もそうでしたが、エラーメッセージだけでは「なぜダメなのか」といった状態でした。
本記事では、「とりあえず動かす」から一歩進んで、
仕組みを理解しながら書けるようになることを目的にしています。
対象者
- Javaを学び始めたばかりの方
- プリミティブ型とラッパークラスの違いがあいまいな方
- コンパイルエラーの意味がよく分からない方
- null や Integer の扱いで混乱している方
- シンプルなコードで理解したい方
❌ ① 大きい型 → 小さい型にそのまま代入
long x = 100L;
int y = x; // コンパイルエラー
🔎 なぜ?
- long は 64bit
- int は 32bit
- データがあふれる可能性がある
✅ 正しくは:
int y = (int) x; // キャストが必要
❌ ② 小数を int にそのまま代入
double d = 3.14;
int x = d; // コンパイルエラー
🔎 なぜ?
- 小数 → 整数にすると情報が失われる
- double は小数を含む
- int は整数のみ
✅ 正しくは:
int x = (int) d; // → 3 になる(切り捨て)
⚠ 小数部分は消える!
❌ ③ int に null を入れようとする
int x = null; // コンパイルエラー
🔎 なぜ?
- int はプリミティブ型
- null(「何も参照していない」という意味)は入れられない
✅ null を使いたいなら:
Integer x = null; // OK
❌ ④ null をアンボクシングしてしまう
Integer x = null;
int y = x; // 実行時エラー(NullPointerException)
🔎 なぜ?
- Integer → int に変換(アンボクシング)
- 中身が null なのでエラー
⚠ これはコンパイルは通るが実行時に落ちるので危険!
❌ ⑤ Integer を == で比較する
Integer a = 200;
Integer b = 200;
System.out.println(a == b); // false
🔎 なぜ?
- Integer はオブジェクト
- == は「値」ではなく「参照」を比較する
✅ 正しくは:
a.equals(b);
❌ ⑥ 文字列をそのまま数値に入れる
String s = "123";
int x = s; // コンパイルエラー
✅ 正しくは:
int x = Integer.parseInt(s);
- String と int はまったく別の型
- 数字以外が入ると例外が発生
- 数字以外が入ると NumberFormatException が発生します。
🎯 ここだけ覚えておけばOK
✔ 小 → 大 は自動
✔ 大 → 小 はキャスト
✔ 小数 → int は切り捨て
✔ int に null は入らない
✔ Integer の比較は equals
✔ 文字列 → 数値は parseInt
おわりに
型変換のエラーは、初心者のうちは「意味不明な壁」に感じます。
ですが実は、Javaはとても親切で、
- 危険な変換はコンパイル時に止めてくれる
- null の誤使用は例外で知らせてくれる
- 型の安全性を守ってくれている
という設計になっています。
エラーは「怒られている」のではなく、
「バグを未然に防いでくれている」サインです。
型変換を理解すると、
- NullPointerException の原因が分かる
- なぜ equals を使うのか理解できる
- 自信を持ってコードが書ける
ようになります。
この記事が、
「なんとなく動かす」から「仕組みを理解して書く」
への一歩になれば嬉しいです。