Natknąłem się na ten fragment:
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);
}
}
Spowoduje to błąd kompilacji:
Błąd: (15, 9) java: odwołanie do printSum jest niejednoznaczne, zarówno metoda printSum (int, double) w ParamTest, jak i metoda printSum (długa, długa) w ParamTest
Jak to jest niejednoznaczne? Czy w tym przypadku nie należy promować tylko drugiego parametru, ponieważ pierwszy parametr jest już liczbą całkowitą? Pierwszy param nie musi być promowany w tym przypadku, prawda?
Kompilacja powiedzie się, jeśli zaktualizuję kod, aby dodać inną metodę:
public static void printSum(int a, long b) {
System.out.println(String.format("%s, %s ", a, b));
}
Pozwól, że rozwinę się, aby wyjaśnić. Poniższy kod powoduje niejednoznaczność:
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);
}
}
Zatem poniższy kod również powoduje niejednoznaczność:
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);
}
}
Jednak nie powoduje to dwuznaczności:
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
- to nie jest metoda dwuznaczna, to wywołanie metody niejednoznacznej.