问题描述
将包装类型 (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 被转换为原始类型,因为它被用作数组索引。