Как вызвать родительский метод нескольких вложенных внутренних классов

1

Я хочу назвать Af() из Bf(), но оба являются внутренними классами, если я пишу традиционный способ, он не компилируется. Любой простой способ без временной переменной, такой как A _this в коде?

class MyClass {
  [...]
  class A {
    public void f(){System.out.println("A.f");};
    public void g(){System.out.println("A.g");};
  }
  class B {
    public void f(){System.out.println("B.f");};
  }

  public A a() {
    return new A() {
      public void g() {
        // I want to avoid this step
        final A _this = this;
        new B() {
          public void f() {
            System.out.println("foo");
            // this works
            _this.f();
            // but this does not compile
            A.this.f();
          }
        }.f();
      }
    };
  }
  [...]
}
  • 0
    у вас есть концептуальные ошибки в коде. Есть несколько способов исправить это. Какое решение выбрать, зависит от реального кода реального мира. так как это выглядит как упрощенный пример реальной проблемы, трудно сказать, как бы вы ее исправили. если бы это был ваш реальный код, вы бы сделали все методы f и g статическими, а затем могли бы вызвать Af();
  • 1
    @sol4me sol4me // but this does not compiles . ОП знает это.
Показать ещё 3 комментария
Теги:
inner-classes

1 ответ

0

Вам необходимо правильно окружить код в скобках, а затем A.this.f()

class A {
    public void f() {
        System.out.println("A.f");
    }

    public void g() {
        System.out.println("A.g");
    }

    public A a() {
        return new A() {
            public void g() {
                =
                new B() {
                    public void f() {
                        System.out.println("foo");
                        A.this.f();
                    }
                }.f();
            }
        };
    }

    public static void main(String[] args) {
        new A().a().g();
    }
}

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

}

Обновлено: вы можете заменить _this.f(); с new MyClass().new A().f(); но это приведет к созданию нового объекта.

  • 0
    A и B - 3-сторонние классы, я не могу изменить API.
  • 0
    @ user3752469 A.this.f(); не будет работать, потому что A не включает класс. Текущее решение, которое у вас есть `final A _this = this;` - это способ доступа к A во вложенном классе B
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню