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));