路径依赖关系和内部类



以下示例代码无法编译,并出现下面列出的错误。

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

我不完全确定,但阅读内部类表明这是预期的行为?具体到下面这句话:

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

如果是这种情况,并且这确实是所需的行为,有没有办法在 Scala 中对此要求进行编码?

有一些类似的问题,但它们都涉及内部类型,而不是类,并且提出的解决方案将不适用。

这是一种在需要时

维护路径依赖类型安全性的方法。首先,修改UseOuter以将pdp类型作为类型参数:

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

然后,当您实例化UseOuter 时,显式传递pdp.type作为类型参数:

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

这允许编译器记住UseOuter中的pdpUseCase中的pdp相同,因此类型正确匹配。

例如,

您可以使用类型投影:

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)
}

最新更新