拡大変換と縮小変換
自動的に行われる拡大変換と、安全に明示的な縮小キャストを行う方法を学びます。
「拡大変換と縮小変換」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
Javaの型変換
Javaでは、互換性のある型の間で値を変換できます。方向は2つあります。
- 拡大変換 — より大きな型への変換(安全で自動的)
- 縮小変換 — より小さな型への変換(リスクがあり、明示的なキャストが必要)
拡大変換
拡大変換は、値を互換性のあるより大きな型に代入するときに自動的に行われます。変換先の型は変換元のすべての値を表現できるため、データは失われません。
拡大変換の順序:byte → short → int → long → float → double
byte b = 42;
short s = b; // byte → short (widening)
int i = s; // short → int (widening)
long l = i; // int → long (widening)
float f = l; // long → float (widening)
double d = f; // float → double (widening)
System.out.println(d); // 42.0縮小変換
縮小変換は、キャスト演算子(type)を使って明示的に行う必要があります。値が変換先の型に収まらない場合、切り捨てられたり破損したりする可能性があります。
double price = 99.99;
int wholePart = (int) price; // narrows — decimal truncated
System.out.println(wholePart); // 99 (not rounded!)
long bigNum = 130L;
byte small = (byte) bigNum; // 130 overflows byte (max 127)
System.out.println(small); // -126 (unexpected!)縮小変換時のオーバーフロー
縮小変換中に値がオーバーフローすると、Javaは剰余演算を使って値を循環させます。例外はスローされません。そのため、手動で対策する必要があります。
int million = 1_000_000;
byte narrowed = (byte) million;
System.out.println(narrowed); // 64 (wraps around)
// Safe narrowing: check bounds first
if (million >= Byte.MIN_VALUE && million <= Byte.MAX_VALUE) {
byte safe = (byte) million;
} else {
System.out.println("Value doesn't fit in byte!");
}charとintの変換
charはUnicodeコードポイントを表す16ビット符号なし整数です。intへは自動的に拡大変換されますが、intからcharへ戻すには明示的なキャストが必要です。
char letter = 'A';
int code = letter; // widening: char → int
System.out.println(code); // 65
int nextCode = code + 1;
char nextLetter = (char) nextCode; // narrowing: int → char
System.out.println(nextLetter); // B
// Useful for Caesar cipher shifts
char shifted = (char) ('a' + 3);
System.out.println(shifted); // d浮動小数点数から整数への切り捨て
浮動小数点数を整数にキャストすると、ゼロ方向に切り捨てられます。丸め処理は行われません。丸めが必要な場合はMath.round()を使用してください。
double pos = 3.9;
double neg = -3.9;
System.out.println((int) pos); // 3 (not 4)
System.out.println((int) neg); // -3 (not -4)
System.out.println(Math.round(pos)); // 4
System.out.println(Math.round(neg)); // -4Stringから数値への変換
Stringを数値にパースするには、キャストではなくラッパーメソッドを使用します。数値ではない文字列を渡すと、NumberFormatExceptionがスローされます。
String input = "42";
int parsed = Integer.parseInt(input);
double parsedD = Double.parseDouble("3.14");
System.out.println(parsed + 1); // 43
System.out.println(parsedD); // 3.14
try {
int bad = Integer.parseInt("abc");
} catch (NumberFormatException e) {
System.out.println("Not a valid number!");
}数値からStringへの変換
数値をStringに変換するには、String.valueOf()、Integer.toString()、または""との文字列連結を使用できます。
int score = 95;
String s1 = String.valueOf(score); // "95"
String s2 = Integer.toString(score); // "95"
String s3 = score + ""; // "95" (concat trick)
System.out.println(s1.getClass().getSimpleName()); // String
// Converting to different bases
System.out.println(Integer.toBinaryString(42)); // 101010
System.out.println(Integer.toHexString(255)); // ff式における昇格
算術式では、Javaがオペランドを自動的に昇格させます:
byte、short、char→ 演算の前にintへ昇格- いずれかのオペランドが
longの場合、結果はlong - いずれかが
floatまたはdoubleの場合、結果はより広い型に一致
byte x = 10;
byte y = 20;
// byte z = x + y; // compile error! sum is promoted to int
int z = x + y; // correct
long a = 100L;
float b = 2.5f;
double result = a * b; // long * float → double
System.out.println(result); // 250.0複合代入演算子
+=、-=、*=などの複合演算子には、暗黙の縮小キャストが含まれています。これにより、byteやshortの変数を使って簡潔なコードを書けます。
byte count = 100;
// count = count + 1; // compile error — int result needs cast
count += 1; // OK — compound op casts automatically
System.out.println(count); // 101
short total = 1000;
total *= 2; // implicit narrow cast included
System.out.println(total); // 2000実践:安全な整数のパース
実際の開発でよく使うパターンです。ユーザー入力を安全にパースし、範囲を検証して、必要な正確な型に縮小します。
public static byte parseAsByte(String input) {
int value = Integer.parseInt(input); // can throw NumberFormatException
if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
throw new IllegalArgumentException(
"Value " + value + " out of byte range");
}
return (byte) value;
}
// Usage
System.out.println(parseAsByte("100")); // 100
System.out.println(parseAsByte("200")); // IllegalArgumentExceptionクイックチェック
次のコードの出力は何でしょうか?
double d = -7.8; int i = (int) d; System.out.println(i);
復習:拡大変換と縮小変換
重要なポイント:
- 拡大変換は自動的かつ安全です:byte→short→int→long→float→double
- 縮小変換には明示的なキャストが必要で、データ損失やオーバーフローが発生する可能性があります
- charはintへ拡大でき、intはキャストによってcharへ縮小できます
- 浮動小数点からintへの変換はゼロ方向に切り捨てられます(丸めではありません)
- Integer.parseInt/Double.parseDoubleを使用してStringを数値に変換します
- 複合演算子(+=、*=)には暗黙の縮小キャストが含まれています
よくある質問
「拡大変換と縮小変換」レッスンは無料ですか?
はい。「拡大変換と縮小変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「拡大変換と縮小変換」で何を学びますか?
自動的に行われる拡大変換と、安全に明示的な縮小キャストを行う方法を学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「拡大変換と縮小変換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プリミティブ型と参照型
- 拡大変換と縮小変換
- instanceof 演算子
- 型キャストの実践