2015-02-22 4 views
12

Ho scritto questo codice di provaPerché il cast implicito implicito in float piuttosto che double quando si richiama il costruttore?

public class ConstructorTestApplication { 

    private static String result; 


    public static void main(String[] args) { 

     ConstructorTest test1 = new ConstructorTest(0); 
     System.out.println(result); 
    } 

    private static class ConstructorTest { 

     public ConstructorTest(double param){ 
      result = "double constructor called!"; 
     } 
     public ConstructorTest(float param) { 
      result = "float constructor called!"; 
     } 


    } 
} 

Il risultato è stato

float constructor called! 

Perché il costruttore galleggiante chiamato piuttosto che il doppio costruttore? Questa parte della ricerca del metodo dinamico?

+0

Ti aspettavi che il cast fosse raddoppiato? Se è così, perché? – Ridcully

+0

Non mi aspettavo un modo o l'altro. La domanda è arrivata in classe e ho scritto il test per vedere ma non so perché il float ha la precedenza sul doppio. –

+1

Non c'è alcuna ricerca di metodo dinamico qui. – EJP

risposta

19

ConstructorTest(float param) è il metodo più specifico tra i due costruttori, poiché un metodo con un argomento double può accettare qualsiasi valore float, ma il contrario non è vero.

JLS 15.12.2.5:

15.12.2.5. La scelta del metodo più specifico

Se più di un metodo membro è accessibile e applicabile ad una chiamata di metodo , è necessario scegliere uno di fornire il descrittore per il metodo di spedizione in fase di esecuzione. La lingua Java di programmazione utilizza la regola che è stata scelta il metodo più specifico .

L'intuizione informale è che un metodo più specifico di altro eventuale invocazione gestita dal primo metodo potrebbe essere passato sulla all'altro senza un errore in fase di compilazione.

3

I presenti JLS 5.3. Method Invocation Conversion e 5.1.2. Widening Primitive Conversion

19 conversioni specifiche su tipi primitivi sono chiamati ampliamento conversioni primitive:

byte a breve, int, long, float o doppio

short to int, long, float, double

char int, long, float o doppio

int long, float o doppio

lungo per galleggiare o doppia

galleggiante raddoppiare

Essenzialmente galleggianti sono messi in priorità su raddoppia nel sovraccarico del metodo quando si esegue il cast.

+3

OP già lo sa. Ha chiesto perché. – EJP