2014-04-10 7 views
6
public class aman { 
    void m(double a , int b, int c) { 
     System.out.println("second"); 
    } 
    void m(float a , int b, double c) { 
     System.out.println("first"); 
    } 
    public static void main(String[] args) { 
     aman obj = new aman(); 
     obj.m(23, 12, 1); 
    } 
} 

Qui, metodo m() è stato sovraccaricato ma non sono comprendere perché la chiamata è ambigua perché nel primo metodo solo 1 conversione deve avvenire mentre nel secondo metodo, sono necessarie due conversioni. Quindi, sicuramente il primo metodo avrebbe dovuto essere chiamato. Si prega di dare il motivo per cui questo non sta accadendo o se mi manca qualche regola.Quando si utilizza il sovraccarico con la promozione del tipo, perché la chiamata al metodo è ambigua?

risposta

11

Il JLS non considera 2 conversioni e 1 conversione è una differenza. Sarà solo distinguere tra avendo-to-convertire e non-have-to-convertire.

Poiché entrambi i metodi devono convertire, sono ugualmente possibili.

Relativo a questo argomento, c'è my answer on a similar question (ma non completamente lo stesso).

+0

thnks per la tua risposta, l'ho visitata e ho visitato anche http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5 ma qui non ho potuto capire una linea ** Un metodo è più specifico di un altro se qualsiasi chiamata gestita dal primo metodo può essere passata all'altra senza un errore di tipo in fase di compilazione. ** Puoi spiegarlo in modo definitivo – Aman

+0

Definitivamente. Ciò che questa frase significa fondamentalmente è che un metodo può essere considerato più specifico di un altro se qualsiasi chiamata al primo metodo può essere risolta anche con quest'ultimo metodo. Ciò significherebbe che per esempio un metodo 'm (Object)' può risolvere tutte le chiamate a 'm (Utente)' (dato che 'Utente' è un' Oggetto'). Quindi possiamo dire che il metodo 'm (Utente)' è più specifico dell'altro perché le chiamate a 'm (Object)' (come 'm (Integer)') non possono essere risolte da 'm (Utente)' perché lì non c'è alcuna relazione tra 'Integer' e' User'. –

+0

quindi nel mio caso nessun metodo è più specifico, è questo il motivo dell'errore di compilazione? – Aman

-2

È ambiguo perché lo si chiama con tre valori letterali Integer.

si deve utilizzare:

obj.m(23d, 12, 1); 

o

obj.m(23, 12, 1f); 

per portare fuori argomento wich è voluto come è e wich arguement può essere colato.

+0

sì lo so, quindi cosa stai cercando di dire. Si prega di spiegare in dettaglio – Aman

+0

@ user3519914 Ho modificato la mia risposta, questo potrebbe aiutare. Altrimenti vedi anche la risposta di [Jeroen Vannevel] (http://stackoverflow.com/users/1864167/jeroen-vannevel). – ifloop

3

qui, il metodo sarà ambiguo perché si stanno riempiendo tutti i parametri come valori interi, quindi il compilatore confonderà (per il cast di tipo automatico). quindi è necessario definire qualcosa come questo suffisso per il tuo codice:

public class aman { 
    void m(double a , int b, int c) { 
     System.out.println("second"); 
    } 
    void m(float a , int b, double c) { 
     System.out.println("first"); 
    } 
    public static void main(String[] args) { 
     aman obj = new aman(); 

     obj.m(20d, 30, 40);//for calling first method 
     obj.m(23f, 12, 1d);//for calling second method. 
    } 
} 
0

Qui è possibile sia la promozione, sia il flo per raddoppiare. quindi il compilatore non è in grado di prendere una decisione sul metodo da chiamare, quindi fornisce un errore ambiguo in fase di esecuzione. Un buco nel metodo che sostituisce la promozione automatica del tipo.

-1
public class Test { 

    void m(int c , int b, int d) { 
     System.out.println("Automatic promotion in overloading--->"+c); 

    } 

    public static void main(String[] args) { 
     Test obj = new Test(); 
      obj.m('A', 30, 40); 
    } 
} 
+0

Come risponde la domanda? – Pang

Problemi correlati