【问题标题】:How do I pass an ArrayList to a method expecting a vararg (Object...)? [duplicate]如何将 ArrayList 传递给需要 vararg (Object...) 的方法? [复制]
【发布时间】:2011-01-15 21:57:29
【问题描述】:

假设一个具有以下签名的方法:

public static void foo(String arg1, String args2, Object... moreArgs);

运行时...

ClassName.foo("something", "something", "first", "second", "third");

...我会得到moreArgs[0] == "first"moreArgs[1] == "second"moreArgs[2] == "third"

但假设我将参数存储在名为arrayListArrayList<String> 中,其中包含“第一”、“第二”和“第三”。

我想调用foo,以便moreArgs[0] == "first"moreArgs[1] == "second"moreArgs[2] == "third" 使用arrayList 作为参数。

我天真的尝试是......

ClassName.foo("something", "something", arrayList);

...但这会给我moreArgs[0] == arrayList,这不是我想要的。

arrayList 传递给上面的foo 方法以便moreArgs[0] == "first"moreArgs[1] == "second"moreArgs[2] == "third" 的正确方法是什么?

请注意,在这种特定情况下,arrayList 中的参数数量恰好是三个,但我正在寻找的解决方案显然应该是通用的,并且适用于 arrayList 中的任意数量的参数。

【问题讨论】:

    标签: java


    【解决方案1】:

    将您的 ArrayList 转换为对象类型的 Array。

    ClassName.foo("something", "something", arrayList.toArray());

    【讨论】:

    • 哦,就是这么简单!我以为对象...!=对象[]。谢谢! :-)
    • 在一般情况下 Object != Object[],但对于 varargs 方法,编译器将 MyType... 参数转换为 MyType[] 参数,并在运行时将所有参数包装到一个数组中传递到功能。因此,在这种情况下,您可以通过显式传入数组引用来利用 varargs 方法的秘密内部签名。
    【解决方案2】:

    您按照您的预期通过它。但是只有一件事,就是对 ArrayList 的引用。

    然后你必须把你的东西移出数组列表。

    【讨论】:

    • 我只能控制调用foo方法的代码,所以改变foo方法不是一个选项。
    猜你喜欢
    • 2013-07-15
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多