【问题标题】:Access an Anonymous or Local Inner Class Within an Anonymous or Local Inner Class访问匿名或本地内部类中的匿名或本地内部类
【发布时间】:2011-12-12 21:51:06
【问题描述】:

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

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

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

更新二: 使代码示例切中要害。很抱歉!

【问题讨论】:

  • @KublaiKhan 是的,我意识到我的代码示例并不能很好地表明我想要做什么。我发布了一些更新的代码。
  • 我很感兴趣,但您能否将其缩小为SSCCE,以便我们更轻松地为您提供帮助?删除不相关的代码,只向我们展示问题。
  • 很抱歉。让代码更切中要害。
  • 这是*.com/questions/7103087/… 的副本吗?

标签: java class local anonymous


【解决方案1】:

您只需要指定 ParentClass.this.something 即可消除歧义。如果您的 Form 没有方法 invokeMe,您可以简单地使用名称而无需限定,编译器应该会找到它:

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

如果该函数也确实存在于 inner-inner 类中,那么 Java 中没有任何技巧可以做到这一点。而是将您的 ViewBodyPanel.invokeMe 方法重命名或包装成明确的内容。

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

【讨论】:

  • 似乎这样做了。有点希望有另一种方式。谢谢你的回答。
【解决方案2】:

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

如果您使用内部类,您可以执行以下操作

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

【讨论】: