【问题标题】:Static inner classes in scalascala中的静态内部类
【发布时间】:2010-11-07 09:15:42
【问题描述】:

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)

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

【问题讨论】:

    标签: java scala static inner-classes


    【解决方案1】:

    如果您不需要访问内部类中的外部类(鉴于您的内部类被声明为 static,您在 Java 中不会有),您可以这样做:

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

    【讨论】:

      【解决方案2】:

      正如其他人所指出的,“静态”类应该放在伴随对象内。

      在 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。

      【讨论】:

      • 这个类是内部的但不是静态的
      【解决方案3】:

      From scala-lang:

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

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

      【讨论】:

      • 如果你在 Scala 的一个类中声明一个对象,那么它在该类之外是不可见的(或者我不知道如何做到这一点)。你的答案不是我要问的:我问的是如何在 Scala 中做某事,而不是问 Scala 将如何处理 Java 静态
      【解决方案4】:

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

      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)
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 2018-08-28
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 2013-06-30
          相关资源
          最近更新 更多