当前位置: 首页 > 知识库问答 >
问题:

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

堵德曜
2023-03-14

根据Java教程

将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为:

  • 作为参数传递给需要相应基元类型的值的方法
  • 分配给相应基元类型的变量

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

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

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

共有3个答案

巫马玉堂
2023-03-14

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

容俊豪
2023-03-14

拆箱发生在第三行

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

arr是第二行声明的数组

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

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

孟佑运
2023-03-14

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

...

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

...

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

 类似资料:
  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 安装问题 PS C:\Users\Administrator sharp@0.21.3安装C:\用户\管理员\gatsby-site3\node_modules\锐(节点安装/libvips 使用缓存的C:\Users\Administrator\AppData\Roaming\npm-cache\u libvips\libvips-8.7.0-win32-x64.tar.gz info shar

  • reactive 收集依赖不是要通过 Proxy 触发 get 吗,为什么这里只是打印 obj(没有触发 get),也能够收集到依赖?

  • 问题内容: 我正在使用节点4.1.1。当我运行这段代码 我得到这个错误 如果我将代码重新排列为 我得到了预期的结果。 为什么第二个起作用,而第一个失败?可以肯定的是,如果关键字是保留关键字,那么它在所有上下文中都是保留的,而不仅仅是在箭头函数中使用时? 问题答案: 这是因为箭头功能不是生成器功能。例如, 我们可以期望它起作用吗?否。因为不是生成器函数。同样适用于箭头功能。 FWIW,根据ECMAS

  • Python中的字符串是不可变的,这意味着该值不能更改。我正在测试该场景,但看起来原始字符串已被修改。我只是想理解这个概念