当前位置: 首页 > 面试题库 >

Java中的Varargs到ArrayList问题

白光耀
2023-03-14
问题内容

我不明白以下原因为何不起作用:

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

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

不工作,我得到:

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

那就奇怪了。我没有将数组添加到数组列表中,而是将列表中的每个元素添加到arraylist中。这是怎么回事?


问题答案:

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

public void doSomething(Integer... args)

然后,自动装箱将在调用时发生doSomething,而不是在调用时尝试(失败)Arrays.asList

发生的事情是,Java现在正在将每个单独的值传递给您的函数时自动装箱。您之前试图做的是,通过将传递int[]Arrays.asList(),要求该函数执行自动装箱。

但是自动装箱由编译器实现-
它看到您需要一个对象但正在传递一个原语,因此它会自动插入必要的代码以将其变成适当的对象。该Arrays.asList()函数已被编译并需要对象,并且编译器无法将int[]变成Integer[]

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



 类似资料:
  • 问题内容: 编码我来检查Java的vararg性能。 我编写以下测试代码: 在我的机器上,平均输出为: 似乎将变量传递给方法是免费的!好! 但是使用varags慢60倍!为什么呢 一种解释可能是程序必须在堆上创建数组,而时间是由GC花费的。但是对于更少的循环,我仍然得到输出: 什么花费了这些额外的时间,反正编译器拥有将其解决为fix变量调用的所有信息… 这不是我打算为此进行优化的意图,但是我发现这

  • 问题内容: 以下代码无法编译。 发出编译时错误。 对test的引用是模棱两可的,varargspkg.Main中的方法test(int …)和varargspkg.Main中的方法test(float …) 这似乎很明显,因为方法调用中的参数值可以提升为 如果任何一个或两个参数都带有或作为后缀,则会进行编译。 但是,如果我们用相应的包装器类型表示方法签名中的接收参数,如下所示 那么对该方法的调用不

  • 我有一个ArrayList of String。 在每个索引上的外部ArrayList中,每个内部ArrayList有四个项目,有四个参数。 联系人ID 联系人姓名 联系地址 联系号码 现在,我想根据Contact Name参数对的完整ArrayList进行排序。 意味着我要访问外部Arraylist,外部Arraylist的每个索引上存在的内部Arraylist应该根据联系人名称进行排序。 比较

  • 问题内容: 以下代码输出 但是,我期望的是 我哪里错了? 问题答案: 您将两次向同一内部引用添加到外部列表。因此,当您更改内部列表时(通过添加300),您会在“两个”内部列表中看到它(实际上,只有一个内部列表,外部列表中存储了两个引用)。 为了获得理想的结果,您应该创建一个新的内部列表:

  • 问题内容: 我有以下Java代码,其中我试图将ArrayList复制到另一个ArrayList。 我希望“列表”数组采用以下格式: 但是从上面的代码中,“ list”数组输出看起来像这样: 我想您可能已经注意到了差异。我无法达到预期格式的结果。请建议我任何解决方案!提前致谢!! 问题答案: 然后,你需要的: 请注意,已更改为。在Java命名约定中,变量以小写字母开头。类以大写字母开头。

  • 问题内容: 考虑方法声明: 该Object …参数只是对Objects 数组的引用。有没有办法在引用实际Object数组时使用此方法?如果我将Object数组传递给…参数-结果参数值将是一个二维数组-因为an Object[]本身就是an Object: 因此,数组的第一个组件(String.format方法中使用了哪个)将是一个数组,他将生成: 然后由于数组大小为1而发生错误。 该大胆的顺序是真