Java 作為強型別語言,資料型別間的轉換遵循嚴格規則。本文系統整理基本型別的自動轉型(隱式)與強制轉型(顯式)機制,並透過代碼範例演示常見場景與陷阱。
規則:資料範圍小的型別自動提升為範圍大的型別,無精度損失風險(除 int→float、long→float/double 可能損失精度)。
轉型方向圖:
byte → short → int → long → float → double
↑
char

public class Test {
public static void main(String[] args) {
int a = 1;
double b = 1.5;
double sum = a + b; // int 自動提升為 double
System.out.println(sum); // 2.5
String c = "凌";
char d = '晨';
char e = '好';
String concat = c + d + e; // char 自動提升為 String 進行連接
System.out.println(concat); // 凌晨好
}
}
規則:目標型別範圍小於來源型別時,必須使用 (目標型別) 強制轉換,可能導致精度捨入、溢位或符號改變。

public class Test {
public static void main(String[] args) {
int a = (int) 10.2; // double → int,截斷小數位
double b = (double) 10; // int → double,精度無損
System.out.println(a); // 10
System.out.println(b); // 10.0
}
}
byte b1 = 10, b2 = 20;
// byte b3 = b1 + b2; // 編譯錯誤:結果為 int
byte b3 = (byte) (b1 + b2); // 需強轉
byte b = 100; // 合法
// byte b = 200; // 編譯錯誤:超出範圍
char → String:使用 String.valueOf(c) 或 c + ""String → char:僅限單字元字串用 str.charAt(0)| 來源 \ 目標 | byte | short | char | int | long | float | double |
|---|---|---|---|---|---|---|---|
| byte | - | 自動 | 強制 | 自動 | 自動 | 自動 | 自動 |
| short | 強制 | - | 強制 | 自動 | 自動 | 自動 | 自動 |
| char | 強制 | 強制 | - | 自動 | 自動 | 自動 | 自動 |
| int | 強制 | 強制 | 強制 | - | 自動 | 自動 | 自動 |
| long | 強制 | 強制 | 強制 | 強制 | - | 自動 | 自動 |
| float | 強制 | 強制 | 強制 | 強制 | 強制 | - | 自動 |
| double | 強制 | 強制 | 強制 | 強制 | 強制 | 強制 | - |
註:「自動」= 隱式轉型,「強制」= 需顯式造型,「-」= 同類型。