【发布时间】:2011-06-11 12:14:52
【问题描述】:
我有一个场景,我有一些需要相互引用的对象。我可以编译它的唯一方法是使用 lazy
class A(b:B)
class B(a:A)
lazy val a:A = new A(b)
lazy val b:B = new B(a)
我可以使用一些演员做同样的事情,并让它编译
abstract class Message
case class Message1 extends Message
case class Message2 extends Message
class Actor1(otherActor:Actor) extends Actor {
def act() {
loop {
react {
case Message1 =>
println("received message1")
otherActor ! Message2
case _ =>
}
}
}
}
class Actor2(otherActor:Actor) extends Actor {
def act() {
loop {
react {
case Message2 =>
println("received message2")
otherActor ! Message1
case _ =>
}
}
}
}
lazy val actor1:Actor = new Actor1(actor2)
lazy val actor2:Actor = new Actor2(actor1)
但是,当我添加以下内容时:
actor1.start
actor2.start
actor1 ! Message1
我收到以下错误:
线程“main”中的异常 java.lang.NoClassDefFoundError: com/fictitiousCompany/stackOverflowQuestion/Test 造成的: java.lang.ClassNotFoundException: com.fictitiousCompany.stackOverflowQuestion.Test 在 java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在 java.security.AccessController.doPrivileged(本机 方法)在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:307) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248)
我正在使用 Scala Eclipse 插件 2.8.1。
【问题讨论】:
-
我怀疑存在一个单独的问题,即 Eclipse 没有正确设置类路径。您可能想尝试命令行
scala -cp classes com.fictitious.stackOverflowQuestion.Test,其中 classes 指向生成的类文件。 -
奇怪的是,在此之前我可以使用 Eclipse 编写一些相对复杂的代码而不会出现任何问题。我的其他代码仍在运行。也许这是一个 Eclipse 插件错误...?
-
今天晚些时候我将不得不为整个相互依赖对象列表处理这个问题。
-
@Raphael。凉爽的。我实际上有一个相互依赖对象的列表,但将其归结为这个最简单的情况。期待看到你的想法。
-
解决了;实际上是对 huynhjl 答案的或多或少的简单概括。不过这里不适合。
标签: scala reference actor lazy-evaluation forward