【问题标题】:How to instantiate inner classes in one step in Scala?如何在Scala中一步实例化内部类?
【发布时间】:2011-11-11 11:03:09
【问题描述】:

考虑这段代码:

class Outer {
  class Inner
}

在 Java 中,可以使用以下命令创建 Inner 的实例:

Outer.Inner inner = new Outer().new Inner();

我知道我可以用 Scala 写这个:

val outer = new Outer
val inner = new outer.Inner

但我想知道是否可以在不分配给outer 的情况下表达相同的意思。

两者

new Outer.new Inner  

new (new Outer).Inner

编译器不接受。

我有什么遗漏吗?

【问题讨论】:

    标签: java class scala syntax inner-classes


    【解决方案1】:

    首先,我怀疑一次实例化是否有意义——你就像扔掉了Outer 实例,不保留对它的引用。让我想知道,如果您没有考虑 Java 静态内部类,例如

    public class Outer() {
       public static class Inner() {}
    }
    

    在 Scala 中,InnerOutercompanion 对象的内部类:

    object Outer {
        class Inner
    }
    
    new Outer.Inner
    

    如果你真的想要一个内部依赖类,并且你只是想要更方便的语法来实例化它,你可以为它添加一个伴生对象

    class Outer {
       object Inner {
          def apply() = new Inner()
       }
       class Inner
    }
    
    new Outer().Inner()
    

    【讨论】:

    • apply 技巧很酷。我或多或少对语法感兴趣,例如。 G。如果这在 Scala 中真的是不可能的事情......我想这就像 PHP 的限制,即在使用之前需要分配数组元素。
    【解决方案2】:

    如果你有这样声明的类:

    class Outer {
      class Inner
    }
    

    那么你需要先实例化外部类,然后再实例化内部类,如下:

    val outerTest = new Outer()
    val innerTest = new outerTest.Inner()
    

    现在您可以使用 innerTest 变量调用内部类方法。

    【讨论】:

      【解决方案3】:

      这对我有用

      it("Instantiate inner java class in scala") {
        val outer: Outer = new Outer()
        val inner = new outer.Inner("","")
      
      }
      

      【讨论】:

      • 但是 OP 明确要求,"...如果没有分配给 outer 的情况下可以表达相同的内容。"
      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 2014-06-18
      • 2011-05-03
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多