访问匿名或本地内部类中的匿名或本地内部类

时间:2011-12-12 21:51:07

标签: java class local anonymous

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

但我的问题是,如果它本身 是一个内部类,如何访问外部类?一些代码可以提供帮助:

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 的方法。我添加了一个代码注释来帮助查明它。

UPDATE TWO:将代码示例提供给点。对不起!

2 个答案:

答案 0 :(得分: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();
            }
        };
    }

答案 1 :(得分:0)

  

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

如果您使用内部课程,则可以执行以下操作

public class A{
   public void printHello(){
      System.out.println("Hello!");
   }
   class B{
      public void accessA(){
         A.this.printHello();
      }
   }
}