2015-11-19 14 views
10

Sono un nuovo arrivato in Java. Oggi ho visto un pezzo di codice in "Pensare in Java", ma non riesco a capire perché produca errori in fase di compilazione.Metodo ambiguo in caso di sovraccarico con argomento variabile

Codice:

public class OverloadingVarargs2 { 
    static void f(float i, Character... args) { 
     System.out.println("first"); 
    } 
    static void f(Character... args) { 
     System.out.println("second"); 
    } 
    public static void main(String[] args) { 
     f(1, 'a'); 
     f('a', 'b'); 
    } 
} 

compilazione lamentava:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2 

risposta

12

Il problema è con f('a', 'b');

Entrambi i metodi hanno un argomento vararg, il che significa che saranno entrambi considerati sulla third and final phase of overloading resolution.

'a' è un char, che può essere convertito automaticamente float via Widening Primitive Conversion.

Sia 'a' e 'b' possono essere convertiti da char a Character utilizzando Boxing Conversion.

Pertanto sono entrambi f(float i, Character... args) e f(Character... args) applicabili per gli argomenti 'a' e 'b', e nessuno di loro ha una precedenza sulle altre.

3

questo provoca problemi perché

f('a', 'b'); 

'a' può essere convertito in int e quindi passato al galleggiare nel primo f().

6

La dichiarazione f('a', 'b'); è ambigua, perché il compilatore non può dedurre quale metodo esatto da richiamare.

La ragione di questo è che il tipo primitivo char è considerato numerico (per ogni carattere è presente un valore intero non negativo corrispondente compreso tra 0 e 65535).

Ecco perché il compilatore non può dedurre se il parametro 'a' sta per il valore intero di 97, che dovrebbe essere poi gettato a floato'a' sta per il carattere 'a' che dovrebbe essere poi autoboxed a Character.