Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用vararg和String[]参数重载两个方法_Java - Fatal编程技术网

Java 使用vararg和String[]参数重载两个方法

Java 使用vararg和String[]参数重载两个方法,java,Java,我想用一个参数重载两个方法,一个是String的方法varargs,另一个是String[],但我实现了以下编译时间错误: Duplicate method registerByName(String...) 我的代码片段是: public void registerByName(String[] names) { } public void registerByName(String...names) { } 为什么?vararg是另一种放置(对象[])的方法,因此方法MyMetho

我想用一个参数重载两个方法,一个是String的方法
varargs
,另一个是
String[]
,但我实现了以下编译时间错误:

Duplicate method registerByName(String...)
我的代码片段是:

public void registerByName(String[] names)
{

}

public void registerByName(String...names)
{

}

为什么?

vararg
是另一种放置
(对象[])
的方法,因此方法
MyMethod(MyObject[]obj)
MyMethod(MyObject…obj)
对于编译器是相同的。只是语法上的糖

你可以参考

在一个数组中必须传递多个参数仍然是正确的,但是varargs特性会自动并隐藏该过程。此外,它与先前存在的API是向上兼容的。例如,MessageFormat.format方法现在有以下声明:

public static String format(String pattern,
                            Object... arguments);
final参数类型后的三个句点表示,final参数可以作为数组或参数序列传递。[……]


如果你有这样的方法

public static void registerByName(String... names);
使用数组参数调用它是完全合法的:

registerByName(new String[] {"sam"});
因此,您不能使用
Type[]
Type…
重载


JVM甚至不知道这两个签名之间的区别。尝试使用varargs方法在类文件上运行
javap

“String…”和“String[]”完全是一回事…

我不知道这是否是一个好的解释。您也可以使用
int
参数调用
foo(整数x)
,但仍然会在两种变体中重载该方法,因此这种推理并不总是有效的。(答案的最后一句更像它)。