我可以用Arrays.asList创建一个数组列表吗?

时间:2018-02-07 17:17:22

标签: java list

假设我想创建一个包含Integer []数组的List。但

Integer[] foo = {1,2,3};
List<Integer[]> bar = Arrays.asList(foo);

第二行不会编译,因为Arrays.asList(foo)将返回一个包含三个整数元素(即1,2,3)的List,而不是具有单个Integer []元素的List。

由于文档将asList方法的参数声明为类型T的varargs,我不明白为什么编译器不会将第二行解释为给定的Integer []类型的单个参数。如何获取单个数组元素的列表?

List<Integer[]> bar = new ArrayList<Integer[]>(Arrays.asList(foo));

这就是我真正想要做的事情,但由于我相信的原因,它也没有编译。

6 个答案:

答案 0 :(得分:4)

前几天刚刚问了一个very similar question,但我认为这是不同的,因为它不是重复的。您需要显式指定要编译的泛型类型,如下所示:

Integer[] foo = {1, 2, 3};        

List<Integer[]> list = Arrays.<Integer[]>asList(foo);

答案 1 :(得分:4)

除非您确实需要将元素设置为其他数组,否则您可以使用:

List<Integer[]> list = Collections.singletonList(foo);

这更有效,因为它专门用于保存一个元素:不必创建数组,包含只是检查相等,大小总是1等。

答案 2 :(得分:2)

没有。 Arrays.asList会对当前数组进行投影,并将第一个维度展平为List。由于您只有一个维度,因此所有这些元素都会被收集到列表中。

如果您有Integer[][]可以执行此操作。

注意:asList接受TT...)的vararg,实际上是T[]。如果您将其替换为Integer[][],则会得到Integer[],因为Integer[][]的某个维度将满足T...的类型要求。

答案 3 :(得分:2)

java中的Varargs只是Java中的一种语法糖。所以,之间没有区别。

Arrays.asList(1,2,3)Arrays.asList(new Integer[]{1,2,3})

所以你可以在下面做些什么来解决你的问题。

    Integer[][] foo = {{1,2,3}};
    List<Integer[]> bar = Arrays.asList(foo);

答案 4 :(得分:1)

Arrays.asList()生成作为参数传递的数组的内容列表。如果您需要创建数组列表,则需要传递给此方法数组数组(例如Integer[][])。

当您将方法Integer[]作为参数而不是Integer[][]传递给它时,它会生成该数组的内容列表(在这种情况下,这些Integer不是{{1}的数组}}为s)。

答案 5 :(得分:1)

将数组包装在另一个数组中将实现您想要的效果:

Integer[] foo = {1,2,3};
List<Integer[]> bar = Arrays.asList(new Integer[][]{foo});
// OR
Integer[][] foo = {{1,2,3}};
List<Integer[]> bar = Arrays.asList(foo);

您也可以手动设置第一个元素:(我可能会说这更具可读性,但意见可能会有所不同)

Integer[] foo = {1,2,3};
List<Integer[]> bar = new ArrayList<>();
bar.set(0, foo);