如何使`this`指向内部类具有相同方法名称的外部类

时间:2015-01-06 18:44:20

标签: java

我们说我有以下代码:

abstract class MyStream
{
    public abstract Iterable<Integer> getIterable();

    public MyStream append(final int i)
    {
        return new MyStream()
        {
            @Override
            public Iterable<Integer> getIterable()
            {
                return cons(/*outer class's*/getIterable(), i);
            }
        };
    }

    public static Iterable<Integer> cons(Iterable<Integer> iter, int i) { /* implementation */ }
}

如何从内部类中引用具有相同名称的外部类的getIterable

MyStream.this应该指向内部类,对吗?如何显示具有相同名称的外部类?

2 个答案:

答案 0 :(得分:8)

如果从匿名类中调用MyStream.this,它将指向外部类,因此下面的代码应该按预期工作:

return const(MyStream.this.getIterable(), i);

(如果没有,你会得到StackOverflowError)。

它起作用的原因是an anonymous class is an inner class


打印outer 1的简化示例:

public static void main(String args[]) {
  MyClass c = new MyClass() {
    @Override public String get() { return "outer"; }
  };
  System.out.println(c.append(1).get());
}

static abstract class MyClass {
  public abstract String get();

  public MyClass append(final int i) {
    return new MyClass() {
      @Override public String get() {
        return cons(MyClass.this.get(), i);
      }
    };
  }

  public static String cons(String iter, int i) { return iter + " " + i; }
}

答案 1 :(得分:1)

MyStream.this没有指向内部类。内部类是匿名。它可能会让您感到困惑,因为您使用了new MyStream() {...},但实际上它是一个新的内部类,它有一个内部名称,而new MyStream() {...}语法只是用来替换SomeClass extends MyStream语法

值得注意的是,内部类扩展 MyClass并且嵌套。这意味着superMyClass.this都存在并且是MyClass引用,但它们是两个不同的对象实例。 super指向内部类实例本身,但将其视为MyClass,而MyClass.this是封闭对象。