Java中的Varargs to ArrayList问题

2022-08-31 16:55:18

我不明白为什么以下内容不起作用:

public void doSomething(int... args){
  List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}

我的理解是编译器将“int... args”转换为数组,因此上述代码应该可以正常工作。

我没有工作,而是得到了:

找不到符号符号:构造函数 ArrayList(java.util.List>) 位置: 类 java.util.ArrayList<int[]<java.lang.Integer>

这很奇怪。我不是在向数组列表添加数组,而是将列表中的每个元素添加到数组列表中。这是怎么回事?


答案 1

Java 不能自动对数组进行装箱,只能自动装箱单个值。我建议将您的方法签名更改为

public void doSomething(Integer... args)

然后,自动装箱将在呼叫时进行,而不是在呼叫时尝试(和失败)。doSomethingArrays.asList

正在发生的事情是,Java现在正在自动框住每个单独的值,因为它被传递给你的函数。您之前尝试做的是,通过传递 to ,您正在要求该函数执行自动装箱。int[]Arrays.asList()

但是自动装箱是由编译器实现的 - 它看到你需要一个对象,但正在传递一个基元,所以它自动插入必要的代码,把它变成一个合适的对象。该函数已经过编译并需要对象,编译器无法将 转换为 .Arrays.asList()int[]Integer[]

通过将自动装箱移动到函数的调用方,您已经解决了这个问题。


答案 2

你可以做

public void doSomething(int... args){
    List<Integer> ints = new ArrayList<Integer>(args.length);
    for(int i: args) ints.add(i);
}

public void doSomething(Integer... args){
    List<Integer> ints = Arrays.asList(args);
}