为什么java没有autobox int []到Integer []

nam*_*olk 10 java arrays autoboxing arraylist

当我做以下,

  • 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));
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 13

区别在于int[]它本身是一个Object,而是Integer[]一个Integer对象的引用数组.

Arrays.asList(T...)method接受某些类型的变量参数,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
Run Code Online (Sandbox Code Playgroud)

所以,在你的代码中Arrays.asList(intArray)返回a ArrayList<int[]>而不是ArrayList<Integer>.您无法将其传递给ArrayList<Integer>()构造函数.


有关: