Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 39
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    167

    A che è dovuto questo errore?

    Salve,
    stavo studiando l'overriding e l'overloading dei metodi in Java e mi è si è presentato un caso che non riesco a spiegarmi logicamente. Allora innanzittutto ecco qui il sorgente dell'esempio in questione:
    ---
    class A
    {
    private long a;

    public void assegna(long x)
    {
    a=x;
    }

    public String toString()
    {
    return "a="+a;
    }
    }

    class B extends A
    {
    private int b1;
    private double b2;

    public B()
    {
    b1=1;
    b2=1;
    }

    public void assegna(int x)
    {
    b1=x;
    }

    public void assegna(double x)
    {
    b2=x;
    }

    public String toString()
    {
    return super.toString()+", b1="+b1+", b2="+b2;
    }

    }

    class C extends B
    {
    private int c1;
    private double c2;

    public void assegna(int x)
    {
    c1=x;
    }

    public void assegna(double x)
    {
    c2=x;
    }

    public String toString()
    {
    return super.toString()+", c1="+c1+", c2="+c2;
    }

    }

    class prova
    {
    public static void main(String args[])
    {
    C gamma=new C();

    gamma.assegna(3L);

    }
    }
    ---
    Quando provo a compilare il compilatore mi restituisce il seguente messaggio d'errore:
    ---
    C:\Programmazione\Prove.java:72: reference to assegna is ambiguous, both method assegna(long) in A and method assegna(double) in C match
    gamma.assegna(3L);
    ^
    1 error
    ---
    Il messaggio d'errore è abbastanza chiaro ed infatti ho capito cosa dice, ma non riesco a capire il perché!!!
    Invocando gamma.assegna(3L) il compilatore dovrebbe scegliere la versione di assegna con argomento long, senza possibilità alcuna di equivoco. Invece mi dice che è ambiguo, dando come possibile alternativa la versione di assegna che riceve come argomento un double.
    Perché?!?!?

    Grazie a chiunque mi risponderà risolvendomi questo rompicapo (la cui spiegazione poi mi sembrerà sicuramente una cavolata ^_^)

  2. #2
    Se gli passi un long come fa a sceglierti il metodo?

    I tuoi metodi possono avere come parametro o int o double, se gli passi un long il compilatore va, ovviamente, in confusione...:gren:
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    167
    Scusa ma la classe C eredita indirettamente questo metodo da A:

    public void assegna(long x)
    {
    a=x;
    }


    Quindi dov'è l'ambiguità? continuo a non capire.

  4. #4
    Mi spiego meglio: un Long si può convertire benissimo in un double, perciò il compilatore va in bambola!!

    Se qualcuno ha idee + precise le esponga...
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    167
    Ma io ho letto nelle dispense che ho che il compilatore, fra due segnature candidate, sceglie quella che ha minor numero di promozioni... quindi da long a long ci sono 0 promozioni, da long a double 2. Quindi dov'è l'equivoco?

  6. #6
    Long in double non richiede casting esplicito...

    Es: Modifica la signature di un metodo con int in uno con long e prova a passargli uno short..

    Credo che ti darà errore lo stesso..:gren:
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    167
    Chi ha parlato di cast esplicito?

  8. #8
    Originariamente inviato da drakend
    Chi ha parlato di cast esplicito?


    Nessuno, ma è come passare ad un metodo che richiede component un Jbutton!!!

    Capisci?
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    167
    Originariamente inviato da blinkago


    Nessuno, ma è come passare ad un metodo che richiede component un Jbutton!!!

    Capisci?
    No, visto che non ho fatto le componenti Swing ancora
    Ad ogni modo io non capisco perché mi nomini il cast implicito o esplicito... il metodo assegna(long) esiste ed è ereditato dalla classe A. Che vuol dire che c'è pure un assegna(double)? Il compilatore in questo caso usa come discriminante il numero di promozioni (implicite) fatte da un tipo di dati all'altro. Visto che c'è la versione di assegna con argomento double... ribadisco... dov'è l'ambiguità?

  10. #10
    Potresti assegnare il valore ad una variabile long e poi passare la variabile, e l`ambiguita` si fotte. Se no fai un cast esplicito:

    codice:
    gamma.assegna( ( long ) 3L );
    Suppongo che per passarlo senza cast debba avvalerti del polimorfismo, perche` assegna() e` overridato e nelle derivate prende solo 'int' e 'double'. Prova cosi`:

    codice:
    A gamma = new C();
    
    gamma.assegna( 3L );
    Ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.