将列表作为varargs传递

xba*_*esx 59 java android list variadic-functions

我有一个List<Thing>,我想将它传递给声明的方法doIt(final Thing... things).有没有办法做到这一点?

代码看起来事情是这样的:

public doIt(final Thing... things)
{
    // things get done here
}

List<Thing> things = /* initialized with all my things */;

doIt(things);
Run Code Online (Sandbox Code Playgroud)

该代码显然不能因为工作doIt()需要Thing不能List<Thing>.

有没有办法传入List作为varargs?

这是在Android应用程序中,但我不明白为什么该解决方案不适用于任何Java

SLa*_*aks 100

只是通过things.toArray(new Thing[things.size()]).

  • 它应该是`things.toArray(new Thing [things.size()]);`. (7认同)
  • 两者都工作@newacct,但我的建议不会创建一个必须立即GC的数组对象. (4认同)
  • 从Java 6及更高版本开始,执行`things.toArray(new Thing [0])`通常更有效率. (3认同)
  • 来自Intellij重构建议的@SLaks"由于OpenJDK 6的最新更新,这个调用是内在的,使得空数组版本的性能相同,有时甚至更好,与预先调整大小的版本相比.同样传递预先大小的数组是危险的对于并发或同步集合,因为大小和toArray调用之间可能存在数据争用,如果集合在操作期间同时收缩,则可能导致数组末尾出现额外的空值.此外,还有一个基准测试表明它更快:/sf/answers/2061121611/ (3认同)
  • 那就行了.(是的@Gray是对的,传递适当大小的数组会更有效率.) (2认同)
  • @chairbender:为什么? (2认同)