PDA

Visualizza la versione completa : A che è dovuto questo errore?


drakend
30-12-2002, 13:42
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 ^_^)

blinkago
30-12-2002, 18:01
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:

drakend
30-12-2002, 18:06
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.

blinkago
30-12-2002, 18:06
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...

drakend
30-12-2002, 18:12
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?

blinkago
30-12-2002, 18:21
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:

drakend
30-12-2002, 18:24
Chi ha parlato di cast esplicito? :)

blinkago
30-12-2002, 18:31
Originariamente inviato da drakend
Chi ha parlato di cast esplicito? :)
:dhò: :dhò:
:dhò: :dhò:
Nessuno, ma è come passare ad un metodo che richiede component un Jbutton!!!

Capisci?

drakend
30-12-2002, 19:01
Originariamente inviato da blinkago
:dhò: :dhò:
:dhò: :dhò:
Nessuno, ma è come passare ad un metodo che richiede component un Jbutton!!!

Capisci?

No, visto che non ho fatto le componenti Swing ancora :bhò:
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à?

r0x
30-12-2002, 19:23
Potresti assegnare il valore ad una variabile long e poi passare la variabile, e l`ambiguita` si fotte. Se no fai un cast esplicito:



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`:



A gamma = new C();

gamma.assegna( 3L );


Ciao.

Loading