Java自动装箱机制中,基本类型数组是否会自动装箱为对应包装类数组?
核心疑问梳理
我之前学过两门大学Java课,但完全记不清这部分内容。网上搜资料只能找到单个基本类型的包装类对应关系,找不到基本类型数组自动装箱的说明:
| 基本类型 | 包装类 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| char | Character |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| boolean[] | ? |
| byte[] | ? |
| char[] | ? |
| short[] | ? |
| int[] | ? |
| long[] | ? |
| float[] | ? |
| double[] | ? |
我原本猜测char[]会转成Character[],或者存在类似CharArray的数组包装类,甚至觉得像其他语言那样转成String才合理。但评论说Oracle并没有提供这类数组包装类,所以想搞清楚:
- 当方法参数是
Object时,char[]这类基本类型数组会转成什么? - 重载场景下行为会不会变?比如有
Object和String参数的重载方法,会不会优先匹配String? - 自动装箱有没有优先级机制,基本类型数组适配
Object参数的行为是否一致?
明确结论与解释
不存在基本类型数组的官方包装类
Java标准库里根本没有CharArray、IntegerArray这类类,基本类型数组本身就是Object的子类(所有数组类型都继承自Object),所以不需要额外的包装类。基本类型数组不会自动装箱为包装类数组
自动装箱只针对单个基本类型(比如int→Integer),完全不适用于数组。比如int[]不会自动转成Integer[],char[]也不会自动转成Character[]——如果需要这种转换,你得自己手动实现(比如遍历数组逐个装箱)。基本类型数组不会自动转为String
哪怕是char[],也不会自动转换成String。只有当你显式调用new String(char[])或者String.valueOf(char[])时,才会得到对应的字符串。如果方法参数是Object,传入char[]时就是直接把这个数组对象传进去,不会触发转String的逻辑。重载方法的匹配规则
Java的方法重载解析是按「最具体的参数类型」匹配:- 如果有方法
foo(Object)和foo(String),传入char[]时会匹配foo(Object),因为char[]和String没有继承或自动转换关系,编译器不会自动把char[]转成String。 - 只有当存在
foo(char[])这个重载方法时,才会优先匹配它;如果没有,就匹配参数类型是父类的foo(Object)。
- 如果有方法
基本类型数组适配Object参数的行为完全一致
所有基本类型数组(boolean[]、int[]、char[]等)在适配Object参数时,都是直接把自身作为Object实例传递,没有任何特殊的优先级或差异化行为——因为它们本质上都是数组类型,都继承自Object。
内容的提问来源于stack exchange,提问作者Pål Hart

