【问题标题】:Why does unboxing occur in this case?为什么在这种情况下会发生拆箱?
【发布时间】:2020-12-19 16:58:27
【问题描述】:

根据Java Tutorial

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

  • 作为参数传递给需要相应原始类型值的方法。
  • 分配给对应原始类型的变量。

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

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

在这种情况下,哪一种情况会发生?是否有一种底层方法可以控制数组中的元素访问?还是 [] 暗示某种变量?

【问题讨论】:

  • 我想我可能有我的问题的答案。那么,每当我们使用 [] 时都会调用 get() 吗? docs.oracle.com/javase/8/docs/api/java/lang/reflect/…
  • 是的,数组索引在 Java 中是 int
  • 您正在链接到教程并从中引用,而不是 JLS。虽然教程中的内容是真实的,但它并不能说明全部真相。
  • 这能回答你的问题吗? Can you index an array with a long int?
  • 答案可以在JLS, §15.10.3找到:“索引表达式经过一元数字提升(§5.6)。提升的类型必须是int,否则会出现编译时错误。 "

标签: java arrays indexing jls unboxing


【解决方案1】:

JLS 15, §15.10.3 很清楚这一点:

...

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

...

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

【讨论】:

    【解决方案2】:

    拆箱发生在第三行

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

    arr 是第二行声明的数组

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

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

    【讨论】:

    • 您好 Edwin,您是否说我链接的 Java 教程是错误的,因为我没有看到整数对象作为参数传递给需要原始 int 或分配给原始变量的方法。
    • @JeffreyK.A 本教程所说的完全正确。它并没有告诉你一切。给出完整的故事不是教程的重点。你是对的,教程没有告诉我们可以使用Integer 对象作为索引。尽管这是可能的。并涉及自动拆箱。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-08-02
      • 2018-12-19
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多