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 ^_^)