我们说我有以下代码:
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
应该指向内部类,对吗?如何显示具有相同名称的外部类?
答案 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
并且嵌套。这意味着super
和MyClass.this
都存在并且是MyClass
引用,但它们是两个不同的对象实例。 super
指向内部类实例本身,但将其视为MyClass
,而MyClass.this
是封闭对象。