2012-05-26 95 views
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方法在m_obj中創建並存儲Outer實例。在anotherMethod中,我收到編譯錯誤。如何修復OuterUtil2

回答

1

如果你只是想與你的函數來解決這個問題,這裏是一個解決方案(在功能var固定在val

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

另一種解決方案是使用一些選項,然而要超過穩定標識符方法,必須從m_obj值中定義一個val。如果沒有定義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) 
    } 
    } 
} 
+0

謝謝!這工作。 – dips

3

類型的前綴(即中的m_obj)必須是穩定值;一個var不會削減它。您可以製作一個val並將初始化從createOuter中移出。