假设我想创建一个包含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));
这就是我真正想要做的事情,但由于我相信的原因,它也没有编译。
答案 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
接受T
(T...
)的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);