2009-07-01 110 views
34

什麼是Java這樣的Scala中模擬:靜態內部類中階

public class Outer { 
    private Inner inner; 

    public static class Inner { 
    } 

    public Inner getInner() { return inner; } 
} 

我特別希望我的內部類必須有一個完全合格的名稱 - 即我想Trade.Type,不是TradeType。因此,在斯卡拉我想象它可能是這樣的:

class Outer(val inner: Inner) { 
    object Inner 
} 

但這似乎不工作:我的斯卡拉Inner似乎並不被從Outer類外可見。當然,一種解決辦法是:

class Inner 
class Outer(val inner: Inner) 

這是確定 - 但因爲我的課的名稱,Inner真是的OuterOuter的「類型」實際上有一個很長的名字。所以:

class SomeHorriblyLongNameType 
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType) 

這是詳細和可怕的。我可以用代替Type,但是它和它所涉及的類之間沒有明顯的聯繫。呼

回答

35

你可以做這樣的事情,如果沒有需要訪問外部類中的內部類(這你就不必在Java中考慮到你的內部類被聲明static):

object A{ 
    class B { 
     val x = 3 
    } 
} 
class A { 
    // implementation of class here 
} 
println(new A.B().x) 
5

From scala-lang

沒有 '靜態' 的成員 Scala中的概念。相反,斯卡拉把Y類的 靜態成員 單身對象Ÿ

這麼看來,你可以有一個對象中定義的類的成員,但不是一個類中定義一個靜態類。

+0

如果您在Scala中聲明瞭一個類中的對象,那麼它在該類之外是不可見的(或者我不知道如何製作它)。你的回答並不完全是我所問的:我在問我如何在Scala中做些什麼,而不是問Scala如何處理Java靜態代碼 – 2009-07-01 17:14:08

+0

我已經在orig qn上展開 – 2009-07-01 17:20:56

25

正如其他人指出的那樣,「靜態」類應放置在伴隨對象內。

在Scala中,作爲類成員的類,特徵和對象都是路徑依賴的。例如:

class Button { 
    class Click 
} 


val ok = new Button 
val cancel = new Button 

val c1 = new ok.Click 
val c2 = new cancel.Click 

現在c1和c2是-different-classes的實例。一個類是好的,點擊,另一個是取消。點擊。如果你想參考所有Click類的類型,你可以說Button#Click。

1

不確定我完全理解你的用例......如果它能幫助你,類內的對象就像實例的字段一樣可見,例如,

case class C(var x: Int) 
class A { case object b extends C(0) } 
val a = new A 
println(a.b.x) 
a.b.x = 2 
println(a.b.x) 

此外,你可以完全覆蓋父母的VAL與對象:

case class C(var x: Int) 
class A { val y: C = C(0) } 
class B extends A { override case object y extends C(2) } 
val a: A = new B 
println(a.y.x) 
0

在Scala中,如果你需要創建一些靜態方法,你可以使用一個同伴對象,用的名稱相同類,您可以在其中存儲所有僞靜態方法。例如:

class A { 
} 

object A { 
    def xpto // define some pseudo static methods here.. 
} 

然後您可以使用A.xpto
嘗試閱讀關於scala上的伴侶模塊的更多信息