我试图在一个较小的例子上复制我的问题。 我在以下代码段中的显示位置收到编译错误。
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
方法在Outer
中创建并存储m_obj
实例。在anotherMethod
中,我收到编译错误。如何修复OuterUtil2
?
答案 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)
}
}
}