我有一个带有以下签名的方法:
public void foo(String... params);
所有这些调用都是有效的:
foo("Peter", "John");
foo(new String[] { "Peter", "John" });
但为什么这个无效?
foo("Peter", new String[] { "John" });
答案 0 :(得分:8)
答案 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
,还是应该“展开”?这会导致非常混乱的行为。