Java中的Varargs到ArrayList问题
我不明白为什么以下方法不起作用:Java中的Varargs到ArrayList问题,java,generics,variadic-functions,Java,Generics,Variadic Functions,我不明白为什么以下方法不起作用: public void doSomething(int... args){ List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args)) } public void doSomething(int…args){ 列表已断开=新建ArrayList(Arrays.asList(args)) } 据我所知,编译器将“int…args”转换为数组,因此上面的代码应该
public void doSomething(int... args){
List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}
public void doSomething(int…args){
列表已断开=新建ArrayList(Arrays.asList(args))
}
据我所知,编译器将“int…args”转换为数组,因此上面的代码应该可以工作
我得到的不是工作,而是:
找不到符号
符号:构造函数ArrayList(java.util.List)
位置:class java.util.ArrayList
真奇怪。我不是将数组添加到数组列表中,而是将列表中的每个元素添加到arraylist中。发生了什么事?在这种情况下,自动装箱(从int
自动转换为Integer
)不起作用。您必须手动将每个int
添加到列表中
如果你经常需要这样的代码,考虑使用的是<代码> org .Apache .Calson .Lang.ArayUTILLS .toObjiTe>(INT/O])/Cux>
< P> java不能自动对数组进行自动打包,而只能是单个值。我建议将您的方法签名更改为
public void doSomething(Integer... args)
然后,在调用doSomething
时将发生自动装箱,而不是在调用Arrays.asList
时尝试(并失败)
现在的情况是,Java在将每个值传递给函数时自动装箱。您之前试图做的是,通过将int[]
传递给Arrays.asList()
,您要求该函数执行自动装箱
但是自动装箱是由编译器实现的——它看到您需要一个对象,但要传递一个原语,所以它会自动插入必要的代码以将其转换为适当的对象。Arrays.asList()
函数已编译,需要对象,编译器无法将int[]
转换为Integer[]
通过将自动装箱移动到函数的调用者,您已经解决了这个问题。您可以这样做
public void doSomething(int... args){
List<Integer> ints = new ArrayList<Integer>(args.length);
for(int i: args) ints.add(i);
}
public void doSomething(int…args){
List ints=新数组列表(args.length);
对于(int i:args)int.add(i);
}
或
public void doSomething(整数…参数){
List ints=Arrays.asList(args);
}
您可以使用番石榴解决此问题:
List<Integer> broken = new ArrayList<>(Ints.asList(args))
List-breaked=newarraylist(Ints.asList(args))
或使用流:
List<Integer> broken = Arrays
.stream(array)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
List-breaked=数组
.stream(数组)
.boxed()
.collect(收集器.toCollection(ArrayList::new));
b/c如果您正在有效地制作列表,请更改int。。。args
到整数。。。args
你可能会很幸运!作品你能解释一下为什么吗?我想我会假设在幕后,当您将集合传递给arraylist时,每个元素都会添加到数组列表中(尽管现在我想起来了,我认为arraylist可能只是某个集合的视图)。如果可以的话,请开导我!谢谢。@Ben B,它的功能与集合的addAll()或映射的putAll()几乎相同。我知道addAll()的功能,但不知道它是如何实现的。它基本上是Object[]a=c.toArray()代码>和系统数组副本(a,0,elementData,size,numNew)
其中c是集合,elementData是ArrayList的支持数组。doSomething(1,2,3)
生成Integer[]a={1,2,3}
,然后生成数组。asList(a)
生成列表。此外,addAll(…)
创建了一个Object[]
数组,该数组可以工作,因为Integer
扩展了Object
boxed()
是一个很好的解决方案
List<Integer> broken = Arrays
.stream(array)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));