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>()构造函数.
有关:
| 归档时间: |
|
| 查看次数: |
3863 次 |
| 最近记录: |