Esto 15.12.2.5 Choosing the Most Specific Method habla de esto, pero es bastante complejo. p.ej. Elegir entre Foo (Números ...) y Foo (Números enteros)
En aras de la compatibilidad con versiones anteriores, estas son en realidad la misma cosa.
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
e.g. puede definir main() como
public static void main(String... args) {
Una manera de hacer que los diferencia es tomar un argumento ante los 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.
Ellos no son exactamente lo mismo. La diferencia sutil es que, aunque puede pasar una matriz a una varargs, no puede tratar un parámetro de matriz como 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.
Además, un varags debe ser el último parámetro.
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
pregunta interesante +1 – mKorbel
Me puede estar faltando algo, pero ¿por qué necesita una sobrecarga? Si declara su método como 'void foo (Object ... args)', puede llamarlo con ** ** ** foo (nuevo Object(), new Object()) '** o **' foo (nuevo Objeto [] {nuevo Objeto(), nuevo Objeto()}) 'y obtiene el mismo resultado. Consulte [esta pregunta relacionada] (http://stackoverflow.com/questions/1656901/varargs-and-the-argument) para ver un ejemplo. –
the vararg es solo un indicador de la firma del método que transmuta la última matriz declarada (como 'int []' o 'Object []') a vararg type. Aparte de eso, no hay diferencia entre las firmas de método. La misma pregunta sería como no se puede sobrecargar el método 'privado' y' público'. – bestsss