Java:命名空间中类的前向声明

4

我该如何在Java中进行前向声明?

我有两个类,它们需要相互调用对方的方法,而且它们位于不同的命名空间中。例如...

package one;

class A {
    public void foo() {
        B b = new B();
        b.bah();
    }
}

并且

package two;

class B {
    public void bah() {
        A a = new A();
        a.foo();
    }
}

更新

在Eclipse中,当遇到这段代码时,会出现编译时错误:"在构建路径中检测到循环依赖..."。


我假设这只是你举的例子,并且你知道它会导致StackOverflowError? - DaveJohnston
3
请注意,这通常表明您的设计存在一些问题。依赖关系通常应该是单向的。 - Joachim Sauer
4个回答

3

只需导入它们。Java在这些方面比C++聪明得多。


Java中导入的顺序并不重要。循环引用可以在没有任何额外代码的情况下实现。 - Thiago Chaves

1
在Eclipse中,当遇到此代码时会提示编译时错误“A cycle was detected in the build path...”。我认为Eclipse之所以抱怨是因为您的工作区中不同Eclipse项目中的类存在循环依赖关系。Eclipse希望能够按线性序列构建项目。如果将相互依赖的类放入同一个项目中,Eclipse就会很高兴了。

0

好的,你需要导入类:

package one;

import two.B;

class A {
    public void foo() {
        new B().bah();
    }
}

或使用他们的全名:

package one;

class A {
    public void foo() {
        new two.B().bah();
    }
}

但是,不用说,在你发布的代码片段中,这肯定会导致异常抛出。


@Ben,是的,我以为你知道,但还是想提一下确保。 - Bart Kiers

0
鉴于这里的评论(即您不需要进行显式的前向声明,因为编译器可以处理),我已将Eclipse错误降级为警告,并且只能忽略它。
要做到这一点,请转到...
窗口>首选项>Java>编译器>构建>构建路径问题>循环依赖关系。

Eclipse 肯定会警告你,如果你运行这段代码,就会出现 StackOverflowError 错误。或者你的真实代码有某种跳出循环的条件,可以停止连续循环吗? - DaveJohnston
这不是“真正的代码”,只是一些描述我的问题的代码示例。 - Ben L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接