2014-12-25 2 views
1

Я хочу называть A.f() из B.f(), но оба являются внутренними классами, если я пишу традиционный способ, он не компилируется. Любой простой способ без временной переменной, такой как 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

У вас есть концептуальные ошибки в коде. существует несколько способов исправить i. какое решение выбрать, зависит от реального кода реального мира. так как это выглядит как упрощенный пример проблемы реального мира, трудно сказать, как вы должны его исправить. Если это ВАС ваш фактический код, вы бы ставили все методы f и g, а затем вы можете вызвать 'A.f();' – hoijui

+1

@ sol4me' //, но это не компилируется'. ОП знает это. – BackSlash

+0

@BackSlash Код 'public A a() {...}' не окружен никакими скобками, если OP правильно помещает код в фигурные скобки, тогда все компилируется отлично и работает. Я не ссылался на '//, но это не компилирует' – sol4me

ответ

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 - классы 3party, я не могу изменить API. – alcala

+0

@ user3752469 'A.this.f();' не будет работать, потому что 'A' не включает класс. Текущее решение, которое у вас есть \t \t final A _this = this; 'является способом доступа A в вложенном классе' B' – sol4me

+0

Я не хочу изменять классы 'A' и' B', они фактически являются частью внешнего API , Я хочу решение в методе 'a()' 'MyClass' – alcala