数组如何使用Arrays.asList(int[])返回List<int[]>?

16

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

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

编译错误返回为无法将List<int[]>转换为List<Integer>。但是在Java中不允许使用List<int>,那么为什么会出现这种编译错误呢?

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

asList的实现如下:

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

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

相关链接:https://dev59.com/OWct5IYBdhLWcg3wh95K#12020391 - Tomasz Nurkiewicz
1
你可能对于 Arrays.asList 如何返回一个 List<int> 感到疑惑,但是错误信息明确地告诉你它返回的是 List<int[]> 而不是 List<int> - Alonso Dominguez
4个回答

12

Arrays.asList不会自动将基础int类型进行自动装箱。

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

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

  • 您可以使用:

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

    使用Apache Commons ArrayUtils


2
该签名<T> List<T> asList(T... os)涉及通用类型T。通用类型的范围仅涵盖引用类型(包括数组类型),但不包括基本数据类型。因此,在使用int[] ints调用Arrays.asList(ints)时,T只能被解析为int[]
在更高层次上,Arrays.asList的目的是提供您的数组的列表视图。这意味着数组保持不变,其元素通过实现List的对象提供。然而,List只能包含对象,而您的数组包含原始的int。这使得该数组无法通过List接口公开。
无论如何,如果您正在寻找一种优雅的语法来创建Integers的列表,请写Arrays.asList(1,2,3)

2

Arrays.asList(...) 可以完美地将一个对象数组转换为该对象的列表。

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

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

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

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

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

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

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

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接