> arrayList1 – 包含一个元素,它是一个int [].
> arrayList2 – not compiling(错误:构造函数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,8}; ArrayList<Integer> arrayList3 = new ArrayList<Integer>(Arrays.asList(integerArray));
题 :
为什么编译器不会将int []中的元素自动复制到整数,并创建一个ArrayList< 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>()构造函数.
有关: