36

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
}

但这似乎不起作用:我的 scalaInner似乎从Outer课堂外看不到。一种解决方案当然是:

class Inner
class Outer(val inner: Inner)

这没关系 - 但由于我的类的名称,Inner它实际上是“类型”Outer并且Outer实际上有一个长名称。所以:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

这是冗长而可怕的。我可以SomeHorriblyLongNameType用 just替换,Type但它和它相关的类之间没有明显的联系。唷

4

5 回答 5

39

如果不需要访问内部类中的外部类(鉴于您的内部类已被声明,您在 Java 中不会拥有),您可以执行以下操作static

object A{
    class B {
        val x = 3
    }
}
class A {
    // implementation of class here
}
println(new A.B().x)
于 2009-07-01T17:22:44.913 回答
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 是不同类的实例。一类是ok.Click,另一类是cancel.Click。如果你想引用所有 Click 类的类型,你可以说 Button#Click。

于 2009-07-02T01:08:32.503 回答
6

从 scala-lang

Scala 中没有“静态”成员的概念。相反,Scala 将类 Y 的静态成员视为单例对象 Y 的成员

因此,您似乎可以在 Object 中定义一个类,但不能在类中定义一个静态类。

于 2009-07-01T16:51:24.157 回答
2

不确定我是否完全理解你的用例......如果它可以帮助你,类中的对象就像实例的字段一样可见,例如

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)
于 2009-07-02T07:25:52.420 回答
1

在 scala 中,如果您需要创建一些静态方法,您可以使用与类同名的伴随对象,其中存储所有伪静态方法。前任:

class A {
}

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

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

于 2009-12-05T04:05:02.847 回答