我有这种情况:

public class A
{
  private final Integer index;

  public Integer getIndex() { return index; }

  public static class B
  {
    //unimportant
  }
}

public class C extends B
{
  //how to reference getIndex() here?
}


如何在C类的正文中调用getIndex()?

最佳答案

奇怪的情况...但是您必须将C类转移到A类中作为内部类。耸耸肩?很好奇为什么首先要扩展内部类?造成此问题的设计限制是什么?根本不判断你。设计背后的思想可能有助于寻找替代解决方案。

public class A
{
   // make sure final value is set here or in constructor
   private final Integer index = 0;

   public Integer getIndex() { return index; }

   public static class B
   {
      //unimportant
   }

   //Doesn't make much sense... but...
   public class C extends B
   {

      //can now call getIndex()
      public void callGetIndex() {
         getIndex();
      }

    }
}


奖金研究:
对于那些可能像我一样好奇的人,并考虑过使用它来引用另一个文件中的函数。如果您将C编译到另一个文件中,然后尝试使用以下内容来访问getIndex:

A.this.getIndex();


遗憾的是,这是行不通的,因为即使C扩展了B,它仍然需要用A括起来才能使该方法起作用。您得到此编译时错误:

C.java:5: error: not an enclosing class: A
        A.this.getIndex();
         ^
1 error


嘿,酷!另一个答案,基于以下@mzl的答案:
有趣的是,您可以使B保持静态,并扩展两个类以获得所需的功能。例如,如果您无法编辑文件A.java,这将很有用,因为A.java是第三方功能。 (在这里为@mzl信用提供以下答案)

这就是您要这样做的方式! (测试了通过javac A.java C.java进行编译)

A.java

public class A
{
  private final Integer index = 0;

  public Integer getIndex() { return index; }

  public static class B
  {
    //unimportant
  }

}


C语言

public class C extends A
{

    public class D extends A.B {
        //can now call getIndex()
         public void callGetIndex() {
            getIndex();
         }

    }

 }


我创建了一个静态的溢流项目,在这里证明@mzl的理论:
https://github.com/davethomas11/stackoverflow_Q_39441077

一哥。您会注意到我在D之前创建了C的实例,以确保可以访问getIndex()。我还没有测试如果直接实例化D会发生什么,我稍后会做并发布结果。



实例化D的最新更新直接测试。

我在静态主函数中添加了C.D testD = new C.D();

$ sh build.sh
StackOverflowQuestion39441077.java:5: error: an enclosing instance that contains C.D is required
        C.D testD = new C.D();
                    ^
1 error


编译器通过不允许我们这样做来帮助我们。

10-01 20:30