看看这个例子:
class Outer(private val handler: Actor){
def this() = this(new Handler) // type Handler not found ? ?
class Handler extends Actor{
override def act() {
}
}
}
编译器抱怨找不到类Handler
。这是一个错误吗?
答案 0 :(得分:4)
内部类Handler
在外部类实例上有一个引用,并且你试图在外部实例存在之前创建一个new Handler
- 这是不可能的。
您可以尝试这样的事情:
class Outer(h: Actor = null) {
private val handler =
if (h != null) h
else new Handler
class Handler extends Actor {
override def act() {
}
}
}
如果您担心使用null
,可以使用the solution described here替换参数默认值中的null
。
答案 1 :(得分:2)
首先,您可能知道通过点(。)运算符访问内部类。因此,访问Handler
类应为Outer.Handler
。当您在作用域this
时,编译器无法找到Handler
类,因为内部类与外部对象相关联。这里解释得更好:http://www.scala-lang.org/node/115。总之,你得到一个非常不可能的情况,因为内部类隐藏在外部类中,但外部类的实际实例化需要内部类......
有许多方法可以解决这个问题,我想,我会在这里快速勾勒出一个。由于您可能希望Handler
类以某种方式绑定到Outer
,因此我建议创建和对象,然后从此处调用Outer类。因此,您将获得大致相同的语法,并将所有内容存储在一个位置。它可能看起来像这样:
class Outer(private val handler : Actor)
object Outer {
class Handler extends Actor { override def act { } } // The "inner" class
def apply() = new Outer(new Handler)
def apply(handler : Actor) = new Outer(handler)
}
希望有所帮助:)