我有一个带有以下签名的方法:
public void foo(String... params);
因此所有这些调用均有效:
foo("Peter", "John");
foo(new String[] { "Peter", "John" });
但是为什么这个无效?
foo("Peter", new String[] { "John" });
那是因为实际上您尝试传递包含String和另一个Array的Array。
因为不是同一回事。您就是不能这样混合搭配。您的示例中的无效签名将与如下所示的函数签名一起使用:
public void foo(String head, String ... tail)
此方法
public void foo(String... params);
只是此版本的便捷版本:
public void foo(String[] params);
因此,您可以使用可变数量的Strings(将由编译器转换为String数组)或String数组来调用它,但是从设计上来说,这种组合将无法正常工作。
考虑一下。如果您有这样的方法怎么办:
public void foo(Object... objects);
并试图这样称呼它:
foo("bar", new Object[] { "baz" });
应该将第二个位置的Object[]
在varargs调用中被视为单个Object
还是应该“扩展”?这将导致非常混乱的行为。