16

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

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

编译错误返回为cannot convert from List<int[]> to List<Integer>. 但是List<int>在java中是不允许的,为什么会出现这种编译错误呢?

我不是在这里质疑自动装箱,我只是想知道如何Arrays.asList返回List<int[]>

asList 实现是

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

所以它将 int[] 视为 T 这就是发生这种情况的原因。

4

4 回答 4

12

中的基础整数没有自动自动装箱Arrays.asList

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

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

  • 你可以使用:

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

    使用 Apache Commons ArrayUtils

于 2012-08-18T17:53:29.223 回答
2

签名<T> List<T> asList(T... os)涉及泛型类型T。泛型类型的范围仅涵盖引用类型(包括数组类型),而不包括原始类型。因此在调用Arrays.asList(ints)中只能解析为.int[] intsTint[]

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

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

于 2012-08-18T19:36:41.357 回答
2

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

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

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

这意味着您可以创建一个包含单个元素的列表:

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

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

因此,在转换原始数组时,Arrays.asList将尝试返回原始数组列表:

List<int[]> intArrayList = Arrays.asList(new int[]{ 1, 2, 3 });
于 2012-08-18T18:04:50.663 回答
1

数组是java中的对象,而不是原始类型。请注意,它说的是List<int[]>(int-arrays 列表),而不是List<int>.

于 2012-08-18T18:02:17.753 回答