gpt4 book ai didi

java - 范围问题。引用方法如何?

转载 作者:行者123 更新时间:2023-12-01 18:02:45 25 4
gpt4 key购买 nike

我有这样的场景:

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,并尝试使用封闭的 this 访问 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 是第 3 方功能。 (请在下面注明 @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 的理论: 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

编译器通过不让我们这样做来帮助我们。

关于java - 范围问题。引用方法如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39441024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com