java - Java中的Varargs到ArrayList问题

标签 java generics variadic-functions

我不明白为什么以下方法不起作用:

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/

相关文章:

scala - 在 Scala 中,是否可以实例化泛型类型 T 的对象?

javascript - 如何更改相对于另一个下拉列表的下拉列表

java - 为异常情况检测 OutOfMemory

java - 如何修复此 Java 泛型通配符错误?

c++ - 解决 Visual C++ 中缺少 vwscanf 的更好方法?

java - 注释参数 - String[] 类型参数设置为字符串文字

java - 初始化 Map 的类型安全可变参数方法

java - 在 Spring 的步骤之间传递信息?

java - 使用 jQuery Post 上传文件到 Play Controller

java - 有没有办法在没有泛型的情况下确保java在编译时的类型安全