Mi sono imbattuto in questo frammento:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, long b) {
System.out.println("In long " + (a + b));
}
public static void printSum(double a, long b) {
System.out.println("In doubleLONG " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
Ciò comporterà un errore di compilazione:
Errore: (15, 9) java: il riferimento a printSum è ambiguo sia nel metodo printSum (int, double) in ParamTest che nel metodo printSum (long, long) nella corrispondenza ParamTest
Com'è ambiguo? In questo caso non dovrebbe essere promosso solo il secondo parametro poiché il primo parametro è già un int? In questo caso non è necessario promuovere il primo param, giusto?
La compilazione ha esito positivo se aggiorno il codice per aggiungere un altro metodo:
public static void printSum(int a, long b) {
System.out.println(String.format("%s, %s ", a, b));
}
Lasciami espandere solo per chiarire. Il codice seguente si traduce in ambiguità:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, long b) {
System.out.println("In long " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
Quindi questo codice riportato sotto si traduce anche in ambiguità:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(double a, long b) {
System.out.println("In doubleLONG " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
Tuttavia, questo non provoca ambiguità:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, double b) {
System.out.println("In longDBL " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
Error:(15, 9) java: reference to printSum is ambiguous both method printSum(int,double) in ParamTest and method printSum(long,long) in ParamTest match
- non è il metodo ambiguo, è la chiamata al metodo che è ambiguo.