Si consideri il seguente codice di esempio:Java sovraccarico: riferimento a chiamare ambiguo
public class TestClass {
public void doSth(String str, String l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
Quando io ora chiamo new TestClass().doSth("foo", "bar")
ottengo il risultato atteso A
. Ma se cambio la firma del metodo del primo metodo con il parametro chaging l
ad un tipo primitivo:
public class TestClass {
public void doSth(String str, long l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
chiamando new TestClass().doSth("foo", 2L)
darà un errore di tempo reference to call ambiguous
compilazione.
Ho pensato a quello per un po 'di tempo e ho anche consultato lo this stackoverflow question, ma non sono riuscito a capire perché questo accada. A mio parere, lo doSth("foo", 2L)
è più specifico della firma doSth(String string, long l, Object... obj)
e dovrebbe consentire al compilatore di arrivare anche a questa conclusione.
Evidentemente i primitivi possono anche essere oggetti? –
@blahfunk, sì, potrebbero essere impacchettati – Andrew
L'unica spiegazione che viene in mente è [Autoboxing] (https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), ma questo dovrebbe essere un passo di conversione "più lontano" rispetto alla versione primitiva del metodo. – Turing85