扩展内部课程

时间:2012-05-26 15:27:22

标签: scala inner-classes

我试图在一个较小的例子上复制我的问题。 我在以下代码段中的显示位置收到编译错误。

class Outer {
    class Inner
}

object OuterUtil {
  val obj = new Outer
  object xyz extends obj.Inner
  //do something with xyz
}

//-------------------
object OuterUtil2 {
    var m_obj: Outer = null

    def createOuter() = {
        m_obj = new Outer
    }

    def anotherMethod() {
        //Compilation error here: stable identifier required, 
        //but OuterUtil2.this.m_obj found.
        object xyz extends m_obj.Inner
    }
}

object Test {
    OuterUtil2.createOuter
    OuterUtil2.anotherMethod
}

OuterUtil工作正常。 在OuterUtil2中,我将功能分为两个功能。我将Outer实例m_obj存储为成员varcreateOuter方法在Outer中创建并存储m_obj实例。在anotherMethod中,我收到编译错误。如何修复OuterUtil2

2 个答案:

答案 0 :(得分:3)

类型的前缀(即m_obj中的m_obj.Inner)必须是稳定值; var不会削减它。您可以将其设为val并将初始化移出createOuter

答案 1 :(得分:1)

如果你只是想解决你的功能问题,这里有一个解决方案(通过将var修复到函数中的val

def anotherMethod = {
  val obj = m_obj
  new obj.Inner
}

另一种解决方案是使用一些选项,但要覆盖稳定标识符方法,您必须定义val m_obj个值。此解决方案更优雅,因为如果未定义m_obj,则没有空指针异常。

object OuterUtil2 {
  var m_obj: Option[Outer] = None

  def createOuter {
    m_obj = Some(new Outer)
  }

  def anotherMethod = {
    m_obj match{
      case None => None
      case Some(_) => val obj = m_obj.get; Some(new obj.Inner)
    }
  }
}