为什么在这种情况下会发生拆箱?

问题描述

根据Java Tutorial

将包装类型 (Integer) 的对象转换为其对应的原始 (int) 值称为拆箱。当包装类的对象是:

时,Java 编译器应用拆箱:
  • 作为参数传递给需要相应原始类型值的方法。
  • 分配给相应原始类型的变量。

为什么在这种情况下会发生拆箱?

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

在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?还是 [] 暗示某种变量?

解决方法

JLS 15,§15.10.3 在这一点上非常清楚:

...

索引表达式经过一元数值提升 (§5.6)。提升的类型必须是 int,否则会发生编译时错误。

...

在较旧的 JLS 中可以找到类似的段落,例如JLS 8,§15.10.3

,

拆箱发生在第三行

System.out.println(arr[new Integer(1)]);

arr 是第二行声明的数组

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

请注意,arr 的类型是“int 数组”。所有数组都接受 int 作为正在访问的索引。在第 3 行,您传递的是 Integer,这两种类型不一样。一种是原始类型,另一种是 Object 类型。由于存在将 Integer 更改为 int 的“拆箱转换”,因此拆箱发生在值作为索引传递到 int 数组之前。

,

const chartEvents = [ { eventName: 'ready',callback: ({ chartWrapper,google }) => { const chart = chartWrapper.getChart(); const svg = chart.container.getElementsByTagName('svg')[0]; const rects = svg.getElementsByTagName('rect'); google.visualization.events.addListener(chart.container,'ready',() => { let gridlinesIndex = 0; Array.prototype.forEach.call(rects,(rect) => { if (rect.getAttribute('width') === '1') { rect.setAttribute('fill',gridlinesArray[gridlinesIndex]); gridlinesIndex++; } }); chartWrapper.draw(); }); },},]; 中,包装 Integer 被转换为原始类型,因为它被用作数组索引。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...