簡體   English   中英

scala中的靜態內部類

[英]Static inner classes in scala

Scala中使用Java進行此類操作的模擬是什么:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

我特別希望我的內部類不必具有完全限定的名稱 - 即我想要Trade.Type ,而不是TradeType 所以在Scala我想象它可能是這樣的:

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

但是,這似乎並沒有工作:我的斯卡拉Inner似乎沒有從外部可見Outer類。 一個解決方案當然是:

class Inner
class Outer(val inner: Inner)

哪個是好的 - 但由於我的類的名稱, Inner實際上是Outer的“類型”,而Outer實際上有一個很長的名字。 所以:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

這是冗長而可怕的。 我可以用Type替換SomeHorriblyLongNameType ,但是它與它所關聯的類之間沒有明顯的聯系。 表示不快

如果不需要訪問內部類中的外部類(在Java中,您的內部類被聲明為static ),則可以執行此類操作:

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

正如其他人所指出的那樣,“靜態”類應該放在伴隨對象中。

在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-類的實例。 一個類是ok.Click,另一個是cancel.Click。 如果要引用所有Click類的類型,可以說Button#Click。

來自scala-lang

Scala中沒有“靜態”成員的概念。 相反,Scala將類Y的靜態成員視為單例對象Y的成員

因此,似乎您可以在Object中定義一個類,但不能在類中定義靜態類。

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

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)

在scala中,如果需要創建一些靜態方法,則可以使用具有相同名稱的伴隨對象,在該對象中存儲所有偽靜態方法。 例如:

class A {
}

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

然后你可以使用A.xpto
嘗試閱讀有關scala上的隨播模塊的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM