java—为什么在这种情况下会发生解装箱?

4smxwvx5  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(354)

根据java教程
将 Package 类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当 Package 类的对象是以下对象时,java编译器将应用取消装箱:
作为参数传递给需要相应基元类型的值的方法。
赋值给相应基元类型的变量。
在这种情况下为什么要拆箱?

char l = 0;
int arr[] = new int[]{1,2,3};
System.out.println(arr[new Integer(1)]);

在这个场景中,这两种情况发生在哪里?数组中是否有控制元素访问的底层方法?或者[]是否意味着某种变量?

1l5u6lss

1l5u6lss1#

(arr[new Integer(1)] Package 整数被转换为基元类型,因为它被用作数组索引。

r3i60tvu

r3i60tvu2#

拆箱发生在第三行

System.out.println(arr[new Integer(1)]);
``` `arr` 是第二行声明的数组

int arr[] = int[]{1, 2, 3};

请注意 `arr` 是一个“int数组”。所有数组都接受 `int` 对于正在访问的索引。在第3行,您经过一个 `Integer` ,这两种类型是不一样的。一个是基元类型,另一个是基元类型 `Object` 类型。因为存在一个“拆箱转换”来改变 `Integer` 到一个 `int` ,在值作为索引传递到 `int` 数组。
sg3maiej

sg3maiej3#

jls 15,§15.10.3这一点非常清楚:
...
索引表达式进行一元数字提升(§5.6). 升级的类型必须是 int ,或发生编译时错误。
...
类似的段落可以在旧的JLSE中找到,例如jls 8,§15.10.3.

相关问题