在匿名内部类或本地内部类中访问另一个匿名内部类或本地内部类

4

好的,我知道如何访问包含内部类(无论是匿名还是内部)的外部类。

但我的问题是,如果外部类本身也是一个内部类,如何访问外部类呢?以下是一些代码以帮助理解:

public final class LocationPage extends BasePage {
    private static final String CRITERIA_FORM_ID = "CriteriaForm";
    protected Panel onCreateBodyPanel() {
        return new ViewBodyPanel(BasePage.BODY_PANEL_ID) {
            public void invokeMe() {
                // How do I Invoke This Method?
            }

            private Form<CriteriaBean> helpCreateCriteriaForm() {
                return new Form<CriteriaBean>(LocationPage.CRITERIA_FORM_ID) {
                    @Override
                    protected void onSubmit() {
                        LocationPage.this.ViewBodyPanel.invokeMe(); // Compile Error.
                    }
                };
            }
        };
    }
}

更新:对于那些想看我在这里尝试做什么的人,这是一个完整的代码示例。实际上,这是Apache Wicket特定的,但我认为你可以理解。看一下一个名为onSubmit的方法。我添加了一个代码注释来帮助确定它。

更新2:将代码示例简化了一点。对此感到抱歉!


@KublaiKhan 是的,我意识到我的代码示例并不能很好地说明我的意图。我已经发布了一些更新的代码。 - 9ee1
我很感兴趣,但您能否将其缩小到一个SSCCE,以便我们更容易地帮助您?消除无关的代码,只向我们展示问题。 - Paul Bellora
抱歉,已经修改了代码以更加简洁明了。 - 9ee1
这是 https://dev59.com/9FrUa4cB1Zd3GeqPjGH6 的一个副本吗? - waxwing
2个回答

1

您只需要指定ParentClass.this.something来消除歧义。如果您的表单没有invokeMe方法,您可以直接使用名称而不进行限定,编译器应该能够找到它:

        private Form<CriteriaBean> helpCreateCriteriaForm() {
            return new Form<CriteriaBean>(LocationPage.CRITERIA_FORM_ID) {
                @Override
                protected void onSubmit() {
                    invokeMe();
                }
            };
        }

如果在内部嵌套类中也存在该函数,则在Java中没有什么技巧可用。最好将您的ViewBodyPanel.invokeMe方法重命名或包装成一个不含歧义的名称。
  public void vbpInvokeMe(){
     invokeMe();
  }
  private Form<CriteriaBean> helpCreateCriteriaForm() {
        return new Form<CriteriaBean>(LocationPage.CRITERIA_FORM_ID) {
            @Override
            protected void onSubmit() {
                vbpInvokeMe();
            }
        };
    }

看起来就是这样了。我还希望有另一种方法。谢谢你的回答。 - 9ee1

0
好的,我知道如何访问包含内部类(无论是匿名还是非匿名)的外部类。 如果您正在使用内部类,则可以执行以下操作。
public class A{
   public void printHello(){
      System.out.println("Hello!");
   }
   class B{
      public void accessA(){
         A.this.printHello();
      }
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接