【发布时间】:2015-10-09 00:42:47
【问题描述】:
(我一直在重新阅读该问题的标题并思考它看起来有多荒谬,但我向您保证这是对问题的最佳描述,并且我有一个实际应用程序,这是最好的结构。我发誓我我没疯。)
考虑以下问题。每个块都是一个单独的文件:
package myPackage;
public class A {
public int i;
public A(int i) {
this.i = i;
}
public class B {
}
}
package myPackage;
import myPackage.A.B;
public class Main {
public static void main(String[] args) {
class C extends B {
public C(A enclosingInstance) {
enclosingInstance.super();
}
public void show() {
System.out.println(A.this.i);
}
}
A myA = new A(2);
C myC = new C(myA);
myC.show();
}
}
请注意,enclosingInstance 业务是解决涉及中间构造函数调用的问题。见"Why can't outer classes extend inner classes?"。
我希望输出为“2”。但是,我在System.out.println(A.this.i); 上有一个编译错误:
A 类型的封闭实例在范围内是不可访问的
我认为我试图解决的程序化概念是合理的:在 main 内创建一种新类型的 B 以提供给 A,它使用 B 类型可以访问的 A 中的东西。
那么我做错了什么,或者为什么这在 java 中是不可能的?
编辑/更新:请注意,将main 中的代码移动到非静态方法时会出现相同的错误。也就是说,我尝试将static void main 中的所有内容移动到class Main 的一个新的非静态方法go()。然后我将static void main 更改为单行new Main().go();。错误在同一个地方。因此,在静态上下文中定义 class C 似乎不是问题。
【问题讨论】:
-
@snickers10m
B是否使用A的非静态属性?还是私人的(静态的或非静态的)? -
@Dici B 不使用 A 中的任何内容 - B 中根本没有代码。但是作为 B 类型的 C 使用 A 的非静态公共实例变量 @ 987654336@.
-
不确定我是否同意重复,但无论如何。一个简单的解决方法是在
B上定义一个getOuterInstance(),它只返回A.this -
@snickers10m 好的,所以我认为这是糟糕的设计。这就像您试图通过将内部功能暴露给外部类来打破封装
-
@Dici 这行得通,但它有点像 hack。我希望有一个不添加复杂结构的实际解决方案。我也不同意重复的问题,但我正在慢慢地研究重复的问题,看看我能学到什么。
标签: java scope inner-classes local-class