Java 中原始类型数组不会自动装箱为对应包装类数组

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

ring(char[]) 需显式构造):

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())。