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

Java 为什么在这种情况下会发生拆箱?,java,arrays,indexing,jls,unboxing,Java,Arrays,Indexing,Jls,Unboxing,根据"基本法", 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为以下对象时,Java编译器将应用取消装箱: 作为参数传递给需要相应基元类型值的方法。 分配给相应基元类型的变量。 为什么在这种情况下会发生拆箱 char l = 0; int arr[] = new int[]{1,2,3}; System.out.println(arr[new Integer(1)]); 在这种情况下,这两种情况中的哪一种会发生?是否有一个底层方法来管理数组中的元素访

根据"基本法",

将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为以下对象时,Java编译器将应用取消装箱:

  • 作为参数传递给需要相应基元类型值的方法。
  • 分配给相应基元类型的变量。
为什么在这种情况下会发生拆箱

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


在这种情况下,这两种情况中的哪一种会发生?是否有一个底层方法来管理数组中的元素访问?或者[]是否表示某种类型的变量?

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

取消装箱发生在第三行

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

int arr[] = int[]{1, 2, 3};
请注意,
arr
的类型是一个“int数组”。所有数组都接受被访问索引的
int
。在第3行中,您传递的是一个
整数,这两种类型不同。一种是基元类型,另一种是
对象
类型。因为存在“取消装箱转换”要将
整数
更改为
int
,在将值作为索引传递到
int
数组之前,会进行取消装箱操作。

在这一点上非常清楚:

索引表达式进行一元数字升级()。升级的类型必须是
int
,否则会发生编译时错误


类似的段落可以在较旧的JLSE中找到,例如..

我想我可能已经找到了我问题的答案。因此,无论何时使用[]都会调用get()?是的,Java中的数组索引是
int
。您链接到一个教程并引用其中的内容,而不是JLS。虽然教程中的内容是真实的,但它并不能说明全部事实。这是否回答了您的问题?答案可以在“索引表达式经历一元数字提升()。升级的类型必须为int,否则会发生编译时错误。“嗨,Edwin,你会说我链接的Java教程是错误的吗?因为我看不到Integer对象作为参数传递给需要基元int的方法或分配给基元变量的方法。@JeffreyK.a教程所说的完全正确。它没有告诉你一切。教程的重点不是给出完整的story、 您是对的,教程没有告诉我们可以使用
整数
对象作为索引。即使这是可能的。并且涉及自动取消装箱。