java 中原始类型数组不会自动装箱为包装类数组,它们始终是引用类型对象,但与对应包装类数组(如 `integer[]`、`character[]`)不兼容,也不会在方法调用中隐式转换。
在 Java 中,自动装箱(autoboxing)仅适用于单个原始类型值与其对应包装类之间的双向转换,例如 int ↔ Integer、boolean ↔ Boolean。这是由 Java 语言规范(JLS §5.1.7)明确定义的机制,不扩展到数组类型。
这意味着:
int[] arr1 = {1, 2, 3};
Integer[] arr2 = {1, 2, 3}; // 显式创建,每个 int 自动装箱为 Integer
System.out.println(arr1 instanceof Object); // true —— 所有数组都是 Object 子类实例
System.out.println(arr2 instanceof Object); // true
// ❌ 编译错误:无法自动将 int[] 转为 Integer[]
// Integer[] bad = arr1;
// ✅ 但可赋值给 Object(因为数组是引用类型)
Object obj1 = arr1; // OK: int[] → Object(向上转型)
Object obj2 = arr2; // OK: Integer[] → Object当方法接受 Object 参数时,原始类型数组(如 int[])会直接作为 Object 传入(因其本身就是引用类型),不会尝试转换为任何包装类数组或 String:
static void print(Object o) { System.out.println("Object: " + o.getClass()); }
static void print(String s) { System.out.println("String: " + s); }
static void print(Integer[] a) { System.out.println("Integer[]"); }
public static void main(String[] args) {
char[] cs = {'h', 'e', 'l', 'l', 'o'};
print(cs); // 输出:Object: class [C ([C 是 JVM 对 char[] 的内部表示)
// 不会调用
print(String) —— 因为 char[] 不是 String,且无隐式转换
// 也不会尝试转成 Character[] —— 自动装箱不作用于数组
}? 提示:[C、[I、[Z 等是 JVM 规范中对数组类型的符号表示([ 表示数组,C=char,I=int,Z=boolean),印证了原始类型数组是独立的、不可变的运行时类型。
若确实需要 int[] → Integer[],须手动映射(Java 8+ 推荐使用 Stream):
int[] primitive = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitive)
.boxed() // int → Integer
.toArray(Integer[]::new);理解这一点,可避免因误信“数组也会装箱”而导致的编译错误、ClassCastException 或逻辑漏洞。