Java 范围问题。如何使用参考方法?
我有这样一个场景:Java 范围问题。如何使用参考方法?,java,Java,我有这样一个场景: 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扩
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
扩展了没有getIndex()方法的B
C
必须扩展A
才能继承该方法。您不能C
扩展了没有getIndex()方法的B
C
必须扩展A
才能继承该方法。奇怪的场景。。。但是你必须把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.java
public class C extends A
{
public class D extends A.B {
//can now call getIndex()
public void callGetIndex() {
getIndex();
}
}
}
我在这里创建了一个静态溢流项目,证明@mzl的理论:
一个哥德哈。您会注意到我在D之前创建了一个C实例,以确保有权访问getIndex()。我还没有测试如果直接实例化D会发生什么,我稍后会这样做并发布结果
该实例化测试的延迟更新
我添加了C.D testD=newc.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
编译器通过不让我们这样做来帮助我们 奇怪的场景。。。但是你必须把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.java
public class C extends A
{
public class D extends A.B {
//can now call getIndex()
public void callGetIndex() {
getIndex();
}
}
}
我在这里创建了一个静态溢流项目,证明@mzl的理论:
一个哥德哈。您会注意到我在D之前创建了一个C实例,以确保有权访问getIndex()。我还没有测试如果直接实例化D会发生什么,我稍后会这样做并发布结果
该实例化测试的延迟更新
我添加了C.D testD=newc.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
编译器通过不让我们这样做来帮助我们 (我觉得这是一个有趣的理论问题,但在实践中没有什么意义。)
您不能从B
访问A.getIndex
,因为B
是静态的,getIndex
不是,所以要调用getIndex
您需要一个A
的非空实例
假设您可以使B
非静态,您也不能,因为您的方案变得矛盾:
- 一方面,类
B
是内部的,因此要实例化一个新对象,需要a
的前一个非空实例:
A=新的A();
B=a.新的B();
- 但另一方面,类
C
是顶级(而不是内部)类,因此可以直接实例化它。但是,作为B
的子类,它与它的超类受相同的限制:它需要a
的实例。矛盾李>
我认为使其工作的唯一方法是声明getIndex
静态,这样就不需要A
的实例(事实上,从B
进行子类化都不是问题)。(我觉得这是一个有趣的理论问题,但在实践中没有什么意义。)
您不能从B
访问A.getIndex
,因为B
是静态的,getIndex
不是,所以要调用getIndex
您需要一个A
的非空实例
假设您可以使B
非静态,您也不能,因为您的方案变得矛盾:
- 一方面,类
B
是内部的,因此要实例化一个新对象,需要a
的前一个非空实例:
A=新的A();
B=a.新的B();
- 但另一方面,类
C
是顶级(而不是内部)类,因此可以直接实例化它。但是,作为B
的子类,它与它的超类受相同的限制:它需要a
的实例。矛盾李>
我认为让它工作的唯一方法是