Java内置基本类型数组的[]访问运算符返回类型是基本类型还是包装类
Java数组访问返回类型问题解答
你的推论是错误的,核心误解来自对Java算术运算的类型提升规则、自动拆箱逻辑的混淆,和数组[]运算符的返回类型无关。
核心结论
Java数组访问表达式数组名[下标]的返回类型,完全由数组声明时的元素类型决定,和存入元素的来源无关:
- 声明为
char[]的数组,元素都是基本类型char,[]访问返回的就是基本类型char - 声明为
Character[]的数组,元素都是包装类Character,[]访问返回的才是Character类型
你推论的几处误区
1. 基本类型char参与算术运算的结果默认就是int
你认为char减int结果是char,完全是编译期常量赋值的特殊规则给你的错觉:
// 这行能编译通过,不是因为'A'-1的结果是char类型,而是因为'A'是编译期常量 // 'A'-1=64,在char的取值范围内,编译器允许常量结果直接窄化赋值给char char x = 'A' - 1; // 换成变量就会直接编译报错,提示需要把int强转为char char a = 'A'; char x = a - 1; // 编译错误:不兼容的类型: 从int转换到char可能会有损失
Java语言规范明确规定:char、byte、short这类比int范围小的整数类型,参与算术运算时会先自动提升为int类型再计算,运算结果默认是int类型,和是否是包装类无关。
2. 存入char[]的Character对象会自动拆箱
你写的代码char[] xs = {new Character('A')};里,Character对象存入基本类型数组时,编译器已经自动插入了拆箱逻辑,把Character转成基本类型char存进数组,你后续访问xs[0]拿到的还是char,根本不是包装类。
验证方法
你可以用方法重载验证返回类型:
public class Test { static void printType(char c) { System.out.println("返回的是基本类型char"); } static void printType(Character c) { System.out.println("返回的是包装类Character"); } public static void main(String[] args) { char[] charArr = {'A', new Character('B')}; printType(charArr[0]); // 输出:返回的是基本类型char printType(charArr[1]); // 输出:返回的是基本类型char Character[] characterArr = {'A', new Character('B')}; printType(characterArr[0]); // 输出:返回的是包装类Character } }
运行上述代码就能直观看到数组访问的实际返回类型。
内容的提问来源于stack exchange,提问作者vincent
相关产品推荐
相关产品推荐

