代码之家  ›  专栏  ›  技术社区  ›  racetrack

路径依赖关系和内部类

  •  2
  • racetrack  · 技术社区  · 7 年前

    以下示例代码未能编译,错误如下所列。

    class Outer {
      class Inner
    
      val instance: Inner = new Inner
    
      def verify(pd: Inner): Boolean = pd == instance
    }
    
    class UseOuter(val pdp: Outer) {
      def foo: pdp.Inner = pdp.instance
    }
    
    class UseCase {
      val pdp = new Outer
      val user = new UseOuter(pdp)
    
      val i = user.foo
    
      pdp.verify(i)
    }
    

    错误:

    test.sc:19: type mismatch;
     found   : UseCase.this.user.pdp.Inner
     required: UseCase.this.pdp.Inner
      pdp.verify(i)
                 ^
    Compilation Failed
    

    我不完全确定,但在看书 Inner Classes 暗示这是预期行为?具体如下:

    与Java类语言相反,这样的内部类是成员 在scala中,这样的内部类绑定到 外部对象。

    如果是这样的话,这确实是所期望的行为,那么有没有一种方法可以用scala来编码这个需求呢?

    有一些类似的问题,但它们都与内部类型有关,而不是类,并且建议的解决方案将不适用。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Dmytro Mitin    7 年前

    例如,您可以使用 type projections :

    class Outer {
      class Inner
    
      val instance: Inner = new Inner
    
    //  def verify(pd: Inner): Boolean = pd == instance
      def verify(pd: Outer#Inner): Boolean = pd == instance
    }
    
    class UseOuter(val pdp: Outer) {
    //  def foo: pdp.Inner = pdp.instance
      def foo: Outer#Inner = pdp.instance
    }
    
    class UseCase {
      val pdp: Outer = new Outer
      val user: UseOuter = new UseOuter(pdp)
    
    //  val i: user.pdp.Inner = user.foo
      val i: Outer#Inner = user.foo
    
      pdp.verify(i)
    }
    
        2
  •  2
  •   Brian McCutchon    7 年前

    这里有一种方法,它可以在需要的时候维护路径相关类型的安全性。首先,修改 UseOuter 采取的类型 pdp 作为类型参数:

    class UseOuter[O <: Outer](val pdp: O) {
      def foo: pdp.Inner = pdp.instance
    }
    

    然后,当你实例化 有用的 , 明确地 通过 pdp.type 作为类型参数:

    val user = new UseOuter[pdp.type](pdp)
    

    这允许编译器记住 等离子体显示器 在里面 有用的 是一样的 等离子体显示器 在里面 UseCase ,使类型正确匹配。

    推荐文章