Questo 15.12.2.5 Choosing the Most Specific Method parla di questo, ma è piuttosto complesso. per esempio. Scegliere tra Foo (Numero ... ints) e Foo (Intero ... ints)
Nell'interesse della retrocompatibilità, questi sono effettivamente la stessa cosa.
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
, ad es. è possibile definire main() come
public static void main(String... args) {
Un modo per renderli diversi è quello di prendere un argomento prima che i 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.
Essi non sono esattamente gli stessi. La sottile differenza è che mentre si può passare un array a un vararg, non si può trattare un parametro dell'array come vararg.
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.
Inoltre, un varag deve essere l'ultimo parametro.
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
fonte
2012-01-12 16:18:05
domanda interessante +1 – mKorbel
Forse mi manca qualcosa, ma perché è necessario un sovraccarico? Se dichiari il tuo metodo come "void foo (Object ... args)" allora puoi chiamarlo con ** o ** 'foo (nuovo Object(), new Object())' ** o ** 'foo (nuovo Object [] {new Object(), new Object()}) 'e ottiene lo stesso risultato. Vedi [questa domanda correlata] (http://stackoverflow.com/questions/1656901/varargs-and-the-argument) per un esempio. –
il vararg è solo un flag alla firma del metodo che trasmuta l'ultimo array dichiarato (come 'int []' o 'Object []') al tipo vararg. A parte questo, nessuna differenza tra le firme del metodo. La stessa domanda sarebbe come non poter sovraccaricare il metodo 'private' e' public'. – bestsss