2011-11-11 100 views
9

考慮以下代碼:如何在Scala的一個步驟中實例化內部類?

class Outer { 
    class Inner 
} 

在Java中有可能產生的Inner有一個實例:

Outer.Inner inner = new Outer().new Inner(); 

我知道我可以在Scala中這樣寫:

val outer = new Outer 
val inner = new outer.Inner 

但我不知道是否可以表達同樣沒有outer的任務。

兩個

new Outer.new Inner 

new (new Outer).Inner 

不被編譯器所接受。

有什麼我失蹤了嗎?

回答

22

首先,我懷疑在一次去實例化是否有意義 - 你就像扔掉Outer實例,不參考它。使我懷疑,如果你沒有想到Java靜態內部類的,像

public class Outer() { 
    public static class Inner() {} 
} 

這在Scala中會轉化爲Inner是一個內部類Outer同伴對象:

object Outer { 
    class Inner 
} 

new Outer.Inner 

如果你真的想要一個內部依賴類,你只是想要更方便的語法來實例化它,你可以爲它添加一個伴隨對象

class Outer { 
    object Inner { 
     def apply() = new Inner() 
    } 
    class Inner 
} 

new Outer().Inner() 
+0

「應用」技巧很酷。我對語法或多或少感興趣, G。如果這在Scala中確實是不可能的......我想這就像PHP的限制,數組元素需要在使用之前分配。 – soc

0

如果你已經聲明如下類:

class Outer { 
    class Inner 
} 

,那麼你需要實例化外部類,然後再實例化內部類如下:

val outerTest = new Outer() 
val innerTest = new outerTest.Inner() 

現在你可以調用內使用innerTest變量的類方法。

相關問題