我不明白为什么以下方法不起作用:
public void doSomething(int... args){
List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}
我的理解是编译器将“int ... args”转换为数组,所以上面的代码应该可以工作。
我得到的不是工作:
cannot find symbol symbol: constructor ArrayList(java.util.List
<int[]
>) location: class java.util.ArrayList<java.lang.Integer
>
这很奇怪。我不是将数组添加到数组列表中,而是将列表中的每个元素添加到数组列表中。怎么回事?
最佳答案
Java 不能自动装箱数组,只能自动装箱。我建议将您的方法签名更改为
public void doSomething(Integer... args)
然后自动装箱将在调用 doSomething
时发生,而不是在调用 Arrays.asList
时尝试(并失败)。
正在发生的事情是,Java 现在在将每个单独的值传递给您的函数时对其进行自动装箱。您之前尝试做的是,通过将 int[]
传递给 Arrays.asList()
,您要求该函数进行自动装箱。
但是自动装箱是由编译器实现的——它看到您需要一个对象但传递的是一个原语,所以它会自动插入必要的代码以将其转换为适当的对象。 Arrays.asList()
函数已经编译并需要对象,编译器无法将 int[]
转换为 Integer[]
.
通过将自动装箱移至函数的调用者,您已经解决了这个问题。
关于java - Java中的Varargs到ArrayList问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5352382/