Arrays.asList(int )如何返回List ?

在做简单的程序时我注意到了这个问题。

int[] example = new int[10]; List exampleList = Arrays.asList(example);// Compilation error here 

返回编译错误,因为cannot convert from List to List 。 但是java中不允许使用List ,为什么会出现这种编译错误?

我不是在质疑autoboxing,我只是想知道Arrays.asList如何返回List

asList实现是

 public static  List asList(T... a) { return new ArrayList(a); } 

所以它将int []视为T就是为什么会发生这种情况。

Arrays.asList没有对底层int进行自动自动装箱。

  • int[]实际上是一个对象,而不是一个原始对象。

  • 这里Arrays.asList(example)返回ListList确实是无效的语法。

  • 你可以使用:

    List exampleList = Arrays.asList(ArrayUtils.toObject(array));

    使用Apache Commons ArrayUtils

Arrays.asList(...)完美地将对象数组转换为这些对象的列表。

此外, Arrays.asList(...)在Java 5中使用varag构造定义,或者,按顺序,它可以接受未定义数量的参数,在这种情况下,它将所有这些参数视为数组的成员和然后返回包含这些元素的List实例。

 List objList = Arrays.asList(obj1, obj2, obj3); 

这意味着您可以使用单个元素创建列表:

 List objList = Arrays.asList(obj1); 

由于Java中不允许使用List ,因此当您使用int[]数组作为Arrays.asList参数时,它会将其视为列表的单个元素而不是int数组。 那是因为数组本身是Java中的对象,而int (和任何其他原语)不是。

因此,在转换基元数组时, Arrays.asList将尝试返回基本数组的列表:

 List intArrayList = Arrays.asList(new int[]{ 1, 2, 3 }); 

签名 List asList(T... os)涉及generics类型T generics类型的范围仅涵盖引用类型(包括数组类型),但不包括基本类型。 因此,在使用int[] ints调用Arrays.asList(ints)T只能解析为int[]

在更高的层次上, Arrays.asList的目的是提供数组的列表视图 。 这意味着数组保持不变,其元素通过实现List的对象可用。 但是, List s只能包含对象,而您的数组包含原始int 。 这使得数组无法通过List接口公开。

无论如何,如果您正在寻找一个优雅的语法来创建一个Integers列表,请编写Arrays.asList(1,2,3)

数组是java中的对象,而不是基本类型。 请注意,它表示List (int-arrays List ),而不是List