gpt4 book ai didi

java - 为什么 java 不将 int[] 自动装箱到 Integer[]

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:16 26 4
gpt4 key购买 nike

当我执行以下操作时,

  • arrayList1 - 包含一个元素,它是一个 int[] .
  • arrayList2 - 未编译(错误:构造函数 ArrayList<Integer>(List<int[]>) 未定义)
  • arrayList3 - 包含 7 个元素,它们是 Integer对象

代码如下:

int[] intArray = new int[]{2,3,4,5,6,7,8};
ArrayList arrayList1 = new ArrayList(Arrays.asList(intArray));
ArrayList<Integer> arrayList2 = new ArrayList<Integer>(Arrays.asList(intArray));

Integer[] integerArray = new Integer[]{2,3,4,5,6,7,8};
ArrayList<Integer> arrayList3 = new ArrayList<Integer>(Arrays.asList(integerArray));

问题:为什么编译器不自动装箱 int[] 中的元素至 Integer并创建一个 ArrayList<Integer> ?这背后的原因是什么?这是我的愚蠢还是其他原因?

最佳答案

区别是int[]本身就是一个 Object ,而 Integer[]是对 Integer 的引用数组对象。

Arrays.asList(T...) 方法采用某种类型的变量参数 T没有上限。该方法的删除是Arrays.asList(Object...) .这意味着它将接受从 Object 扩展的任何类型的可变数量的参数。 .

int不是 Object , 但原始类型,所以它不能作为 T[] 的单个元素传递,而 int[]是一个 Object本身,它将作为 T[] 的第一个元素。数组(T... 在内部只是一个 T[])。然而,Integer[]将作为 T[] 传递, 每个引用文献在 Integer[]作为不同的参数传递给 T[] .

即使您认为编译器应该对 int[] 的每个元素进行转换也是如此数组到 Integer ,这对编译器来说工作量太大了。首先,它需要获取每个数组元素,并将其装箱到 Integer。 , 那么它需要在内部创建一个 Integer[]从那些元素。那实在是太多了。它已经从 int[] 直接转换了至 Object ,它遵循。虽然我一直希望 Java 允许从 int[] 隐式转换至 Integer[] ,这会让使用泛型的生活变得更简单,但同样,这就是语言的设计方式。

举个简单的例子:

Object[] array = new Integer[10];  // this is valid conversion
Object[] array2 = new int[10]; // this is not
Object obj = new int[10]; // this is again a valid conversion

因此,在您的代码中 Arrays.asList(intArray)返回 ArrayList<int[]>而不是 ArrayList<Integer> .你不能将它传递给 ArrayList<Integer>()构造函数。


相关:

关于java - 为什么 java 不将 int[] 自动装箱到 Integer[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com