Ответ 1
Этот 15.12.2.5 Выбор наиболее конкретного метода об этом говорит, но его довольно сложно. например Выбор между Foo (Number... ints) и Foo (Integer... ints)
В интересах обратной совместимости это фактически одно и то же.
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
например. вы можете определить main() как
public static void main(String... args) {
Способ сделать их разными - это взять один аргумент перед varargs
public Foo(Object o, Object... os){}
public Foo(Object[] os) {}
Foo(new Object(), new Object()); // calls the first.
Foo(new Object[]{new Object(), new Object()}); // calls the second.
Они не совсем то же самое. Тонкая разница заключается в том, что, хотя вы можете передать массив в varargs, вы не можете рассматривать параметр массива как varargs.
public Foo(Object... os){}
public Bar(Object[] os) {}
Foo(new Object[]{new Object(), new Object()}); // compiles fine.
Bar(new Object(), new Object()); // Fails to compile.
Кроме того, последним параметром должен быть параметр varags.
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.