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

问题描述 投票:7回答:5

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

public void foo(String... params);

因此所有这些调用均有效:

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

但是为什么这个无效?

foo("Peter", new String[] { "John" });
java variadic-functions
5个回答
8
投票

docs

参数的类型表明最终论点可以作为数组作为参数序列。

您不能传递参数数组。


2
投票

那是因为实际上您尝试传递包含String和另一个Array的Array。


0
投票

因为不是同一回事。您就是不能这样混合搭配。您的示例中的无效签名将与如下所示的函数签名一起使用:

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

0
投票

此方法

public void foo(String... params);

只是此版本的便捷版本:

public void foo(String[] params);

因此,您可以使用可变数量的Strings(将由编译器转换为String数组)或String数组来调用它,但是从设计上来说,这种组合将无法正常工作。


0
投票

考虑一下。如果您有这样的方法怎么办:

public void foo(Object... objects);

并试图这样称呼它:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.