Arrays.asList(int [])如何返回List <int []>?</int []>

时间:2012-08-18 17:50:11

标签: java

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

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

编译错误以cannot convert from List<int[]> to List<Integer>的形式返回。但是java中不允许使用List<int>,为什么会出现这种编译错误?

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

asList实现是

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

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

4 个答案:

答案 0 :(得分:12)

Arrays.asList中没有对底层整数进行自动自动装箱。

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

  • 此处Arrays.asList(example)返回List<int[]>List<int>确实是无效的语法。

  • 您可以使用:

    列表与LT;整数&GT; exampleList = Arrays.asList(ArrayUtils.toObject(array));

    使用Apache Commons ArrayUtils

答案 1 :(得分:2)

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

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

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

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

List<Object> objList = Arrays.asList(obj1);

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

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

Arrays.asList

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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