我有这种情况:
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
编译器通过不允许我们这样做来帮助我们。