Компилятор Java запрещает создание во внутреннем методе класса с тем же именем, что и во внешнем классе, если подписи разные - PullRequest
0 голосов
/ 27 ноября 2018

Почему этот код работает:

class Parent {
    private void methodA(String a){
        System.out.println(a);
    }

    class Inner {

        void test(int a){
            methodA("1");
        }
    }
}

Но этот код не работает (я просто добавляю метод к внутреннему классу с тем же именем и другой подписью):

class Parent {
    private void methodA(String a){
        System.out.println(a);
    }

    class Inner {

        private void methodA(int a){
            System.out.println(a);
        }

        void test(int a){
            methodA("1");
        }
    }
}

Я не спрашиваю, как заставить это работать.Я хочу сказать, почему второй вариант не работает?Я хочу объяснение, а не решение.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Когда компилятор начинает сканирование кода, он сначала ищет доступную область видимости.Если он не находит его, то только для большей области видимости.

В вашем случае компилятор найдет метод methodA в классе Inner.Поэтому он не будет искать метод, доступный в Parent классе.

Тем не менее, если вы хотите заставить компилятор искать метод класса Parent, чем вы должны использовать приведенный ниже код.

Parent.this.methodA("1");
0 голосов
/ 27 ноября 2018

Это не работает, потому что вы изменили значение имени methodA.

Поскольку метод с именем methodA присутствует в теле класса, в котором вы вызываете метод с именем methodA, компилятор не смотрит на окружающие области.

Конкретный бит спецификации языка - Sec 15.12.1 (выделено мной):

Если форма - MethodName, то есть просто Идентификатор, тогда:

...

Если существует объявление типа, членом которого является этот метод, пусть T будет самым внутренним объявлением типа .Класс или интерфейс для поиска - T.

Вы можете вызывать родительский метод еще с помощью:

Parent.this.methodA("1");
...