java 中原始类型数组不会自动装箱为对应包装类数组;它们始终是引用类型对象,但不会被转换为 `integer[]`、`character[]` 等包装类数组,也不映射为 `string` 或任何特殊“数组包装器”类。
在 Java 中,自动装箱(autoboxing)仅适用于单个原始类型值与其对应包装类之间的转换,例如 int → Integer、boolean → Boolean。该机制由编译器和 JVM 在方法调用、赋值等上下文中自动插入隐式装箱/拆箱操作,但严格限定于 8 种基本类型本身:
| 原始类型 | 包装类 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| char | Character |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
⚠️ 关键澄清:原始类型数组(如 int[], char[])不是原始类型,而是引用类型(即 Object 的子类型)。因此,它们根本不在自动装箱的适用范围内——既不会变成 Integer[],也不会变成 String,更不存在 CharArray、IntArray 等官方包装类(Oracle JDK / OpenJDK 中完全未定义此类类型)。
例如:
int[] arr = {1, 2, 3};
Object obj = arr; // ✅ 合法:int[] 是引用类型,可直接赋给 Object
// Integer[] boxedArr = arr; // ❌ 编译错误:无自动装箱支持当重载方法存在时(如 void m(Object o) 与 void m(String s)),char[] 会优先匹配 Object 版本(因为 char[] 是 Object 的子类),而永远不会自动转为 String ——即使语义上看似合理(如 new St

void m(Object o) { System.out.println("Object"); }
void m(String s) { System.out.println("String"); }
m(new char[]{'h', 'e', 'l', 'l', 'o'}); // 输出:"Object",非 "String"✅ 正确做法:若需包装类数组,必须显式转换:
int[] primitive = {1, 2, 3};
Integer[] wrapper = Arrays.stream(primitive) // Java 8+
.boxed()
.toArray(Integer[]::new);? 总结:
- 自动装箱 ≠ 数组转换;它只作用于单个原始值;
- 所有原始类型数组(T[])本身就是 Object 子类,可直接多态使用;
- 不存在 Character[] 的自动装箱路径,也不存在 CharArray 等“标准数组包装器”;
- 任何数组到集合/包装类结构的转换都需显式编码(如 Arrays.stream()、循环或 Collections.addAll())。








