为什么java不会将int []转换成Integer []

前端之家收集整理的这篇文章主要介绍了为什么java不会将int []转换成Integer []前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我做以下事情时,

> 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>?这是什么原因?是我的愚蠢还是其他原因?

解决方法

区别在于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>()构造函数.

有关:

> int[] and Integer[]: What is the difference?

猜你在找的Java相关文章