在scala中找不到内部类

时间:2011-11-27 09:57:05

标签: class scala

看看这个例子:

class Outer(private val handler: Actor){
  def this() = this(new Handler)  // type Handler not found ? ?

 class Handler extends Actor{
    override  def act() {

    }
  }
}

编译器抱怨找不到类Handler。这是一个错误吗?

2 个答案:

答案 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)
}

希望有所帮助:)