2009-06-04 2 views
10

Wenn ich erklären, nur die 2 varargs Methoden wie folgt:In Java, warum ist der Aufruf foo() nicht zweideutig angesichts 2 Varags Methoden foo (int ... ints) und foo (Object ... Objekte)?

public void foo(String... strings) { 
    System.out.println("Foo with Strings"); 
} 

und

public void foo(int... ints) { 
    System.out.println("Foo with ints"); 
} 

und dann den Code haben:

foo(); 

dies aufgrund der Mehrdeutigkeit einen Compiler-Fehler ist wie erwartet.

Allerdings, wenn ich nur die folgenden zwei Versionen von foo haben:

public void foo(Object... objects) { 
    System.out.println("Foo with Objects"); 
} 

und

public void foo(int... ints) { 
    System.out.println("Foo with ints"); 
} 

dann der Code

foo(); 

ruft die Ints Version des Verfahrens. Kann jemand erklären, warum das zweite Beispiel nicht ähnlich mehrdeutig ist und warum es über die Object-Methode in die int-Methode aufgelöst wird? Vielen Dank.

+1

Sie haben die Anrufe an foo nicht angezeigt, ohne die diese Frage schwer zu beantworten ist. –

+1

Jon, der Aufruf von foo() ist wörtlich foo(), d. H. Mit null Argumenten. Ich werde die Frage bearbeiten, um dies klarer zu machen. – mikej

+0

Mit * nur * int ... und Objekt ..., das kompiliert für mich. Mit String ... und int ... (aber nicht Object ...) tut es nicht. Können Sie die Frage bitte überprüfen? –

Antwort

29

Wenn ich mich richtig erinnere, als ich die scjp vorbereitet habe, im ersten Fall haben Sie 2 Argumente ohne Beziehung zwischen ihnen, so dass der Compiler nicht eine auswählen kann. In der zweiten, mit aktiviertem Boxen (1.5+), kann int Integer sein, was eine Untermenge von Object ist, und der Compiler wird im Falle eines Konflikts immer die spezifischste Definition verwenden.

So wird Integer (int) priorisiert.

+6

Das ist richtig. Von der JLS ... 15.12.2.5 Auswahl der spezifischsten Methode http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 – justinhj

4

Java wird immer den nächstmöglichen Typ verwenden. Wenn Sie also die Methode int übergeben, wenn Sie die int ... -Methode nicht hätten, würde sie sie in Integer autoboxieren und Objekt ... verwenden ist eine int ... Methode, Java wird das zuerst verwenden. Dies ist eine Auswahl im Java-Compiler-Design.

+0

Sprachdesign .. . –

Verwandte Themen