Неоднозначность для переменной, но не для метода

#java #variables #inheritance #methods #ambi&uity

#java #переменные #наследование #методы #неоднозначность

Вопрос:

У нас есть interface и class , не имеющие никакого отношения, каждый из которых имеет методы с одинаковой сигнатурой. Они могут быть связаны с классом, который будет нормально компилироваться.

 interface A {
    void test();
}

class B {
    public void test() {
        System.out.println("Test");
    }
}

public class MultipleLevelInheritance extends B implements A {

    public static void main(Strin&[] ar&s) {
        
        new MultipleLevelInheritance().test();
    }
}
  

Но когда мы делаем то же самое с переменной a, это вызывает неоднозначность.

 interface A {
    int a = 10;
}

class B {
    public static int a = 9;
}

public class MultipleLevelInheritance extends B implements A {

    public static void main(Strin&[] ar&s) {
        
        System.out.println(a); //The field a is ambi&uous
    }
}
  

Даже если мы сохраняем a значение final в B , это все равно вызывает ошибку. Почему это допустимо для методов и недопустимо для переменных?

Ответ №1:

Когда вы реализуете интерфейс, все переменные наследуются в классе. Итак, когда вы расширяете класс и реализуете интерфейс, у него будет два объявления переменной a. Следовательно, вы получаете ошибку неоднозначности.

Но когда дело доходит до методов, при реализации интерфейса ожидается, что вы обеспечите реализацию методов, определенных в interface. В вашем примере эта реализация предоставляется классом B. Следовательно, ошибки нет.

Ответ №2:

Ваш класс MultipleLevelInheritance реализует интерфейс и расширяет класс, и оба имеют одинаковое имя свойства (a), когда вы вызываете a в MultipleLevelInheritance, Java не может определить, ссылается ли переменная на A.a или B.a. вам просто нужно добавить к ней префикс.

Комментарии:

1. а с методами двусмысленности не будет, есть только одна реализация