scala中的静态内部类

时间:2009-07-01 16:02:24

标签: java scala static inner-classes

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
}

但这似乎不起作用:我的scala Inner似乎从Outer类外部看不到。一种解决方案当然是:

class Inner
class Outer(val inner: Inner)

哪个好 - 但由于我的班级名称,Inner实际上是Outer的“类型”,Outer实际上有一个长名称。所以:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

这是冗长而可怕的。我可以用SomeHorriblyLongNameType替换Type但是它与它所关联的类之间没有明显的联系。呼

5 个答案:

答案 0 :(得分:36)

如果不需要访问内部类中的外部类(由于您的内部类被声明为static而不能在Java中使用),您可以执行类似这样的操作:

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

答案 1 :(得分: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-类的实例。一个类是ok.Click,另一个是cancel.Click。如果你想引用所有Click类的类型,你可以说Button#Click。

答案 2 :(得分:6)

From scala-lang

  

没有“静态”成员的概念   在斯卡拉。相反,Scala会对待   Y类的静态成员作为成员   单身对象Y

所以看起来你可以在Object中定义一个类,但不是在类中定义的静态类。

答案 3 :(得分: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)

此外,您可以使用object:

完美地覆盖父级的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)

答案 4 :(得分:1)

在scala中,如果需要创建一些静态方法,可以使用具有相同名称的伴随对象,在该对象中存储所有伪静态方法。例如:

class A {
}

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

然后你可以使用A.xpto 尝试阅读有关scala上的随播模块的更多信息