调用varargs方法混合元素和元素数组不起作用

时间:2010-11-06 13:07:38

标签: java

我有一个带有以下签名的方法:

public void foo(String... params);

所有这些调用都是有效的:

foo("Peter", "John");
foo(new String[] { "Peter", "John" });

但为什么这个无效?

foo("Peter", new String[] { "John" });

5 个答案:

答案 0 :(得分:8)

来自docs

  

决赛后的三个时期   参数的类型表示   最终参数可以作为一个传递   数组 作为一系列参数。

您无法传递参数数组。

答案 1 :(得分:2)

那是因为实际上你试图传递包含String和另一个Array的数组。

答案 2 :(得分:0)

因为它不是一回事。你不能混合搭配。您的示例中的无效代码将使用如下函数签名:

public void foo(String head, String ... tail)

答案 3 :(得分:0)

此方法

public void foo(String... params);

只是这个版本的便利版本:

public void foo(String[] params);

因此,您可以使用可变数量的字符串(将由编译器转换为String数组)或字符串数​​组来调用它,但根据设计,组合将不起作用。

答案 4 :(得分:0)

想一想。如果你有这样的方法怎么办:

public void foo(Object... objects);

试图这样称呼:

foo("bar", new Object[] { "baz" });

第二个位置的Object[]是否应在varargs调用中被视为单个Object,还是应该“展开”?这会导致非常混乱的行为。