これについては 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 の前に 1 つの引数を取ることです
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.
それらはまったく同じではありません。微妙な違いは、配列を可変引数に渡すことはできますが、配列パラメーターを可変引数として扱うことはできないことです。
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.