2009-06-04 6 views
10

Se dichiaro metodi solo i 2 varargs come segue:In Java, perché è il foo call() non ambigua dato 2 varags metodi foo (int ... int) e foo (Object ... gli oggetti)?

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

e

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

e poi il codice:

foo(); 

questo è un errore di compilatore causa dell'ambiguità come previsto.

Tuttavia se ho solo i seguenti 2 versioni di pippo:

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

e

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

quindi il codice

foo(); 

chiama la versione int del metodo. Qualcuno può spiegare perché il secondo esempio non è allo stesso modo ambiguo e perché si risolve con il metodo int rispetto al metodo oggetto. Grazie.

+1

Non hai mostrato le chiamate a pippo, senza le quali questa domanda è difficile da rispondere. –

+1

Jon, la chiamata a foo() è letteralmente foo() cioè con zero argomenti. Modificherò la domanda per renderla più chiara. – mikej

+0

Con * solo * int ... ed oggetto ..., questo compila per me. Con String ... e int ... (ma non Object ...) no. Potresti controllare la domanda per favore? –

risposta

29

Se ricordo correttamente da quando stavo preparando lo SCJP, nel primo caso si hanno 2 argomenti con alcuna relazione tra di loro, in modo che il compilatore non può scegliere uno.

Nel secondo, con boxing abilitato (1.5+), int può essere un intero che è un sottoinsieme di Object e il compilatore, in caso di conflitto, utilizzerà sempre la definizione più specifica. Quindi Integer (int) ha la priorità.

+6

Questo è corretto. Da JLS ... 15.12.2.5 Scelta del metodo più specifico http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 – justinhj

4

Java utilizzerà sempre il tipo più vicino possibile, quindi quando si passa al metodo, se non si ha il metodo int ..., si inserirà automaticamente in Integers e utilizzerà Object .... Da lì è un metodo int ..., Java lo userà per primo. Questa è una scelta nel design del compilatore Java.

+0

Progettazione linguaggio .. . –

Problemi correlati