public static void test(A x, A xx, B xxx) {
System.out.println("TEST 1");
}
public static void test(A x, C xx, A xxx) {
System.out.println("TEST 2");
}
Проблема здесь в том, что оба метода применяются к (A, C, B)
. В этом конкретном случае присутствует неопределенность.
В представленном вами однозначном примере нет общей подписи для обоих объявлений:
public static void test(A x, A xx, B xxx) {
System.out.println("TEST 1");
}
public static void test(A x, A xx, C xxx) {
System.out.println("TEST 2"); //No longer ambiguous, this one is called
}
Первое относится к (A, A, B)
, второе относится к (A, A, C)
. Второй просто переопределяет первый, предоставляя более конкретный вариант использования (подпись). Возможно, вы захотите считать это переопределением первого, хотя это, вероятно, не технический термин.
По расширению C
- это A
, поэтому при выборе метода вызова, где параметр равен C
или A
, интерпретатор вызовет либо (следовательно, может возникнуть неоднозначность), но должен вызвать тот, у которого больше конкретный параметр, если имеется. Это может быть описано как полиморфизм; тип времени выполнения экземпляра используется для определения того, что классы и вызовы методов ищутся из класса-потомка.
Как указывает Дж. Б. Низет, языковые спецификации являются здесь авторитетом, но я тоже люблю экспериментировать.