1

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

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为成员var。该方法创建实例createOuter并将其存储在. 在,我收到编译错误。如何修复?Outerm_objanotherMethodOuterUtil2

4

2 回答 2

3

类型的前缀(即m_objin m_obj.Inner)必须是稳定值;avar没有削减它。您可以将其设为 aval并将初始化移出createOuter.

于 2012-05-26T17:02:03.260 回答
1

如果您只想解决函数的问题,这里有一个解决方案(通过将函数中的vara固定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)
    }
  }
}
于 2012-05-27T09:19:19.377 回答