Scala 路径依赖和内部类

Scala 路径依赖和内部类,scala,dependent-type,path-dependent-type,Scala,Dependent Type,Path Dependent Type,以下示例代码未能编译,错误如下所示 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

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

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语言相反,类Java语言的内部类是成员 在Scala中,这样的内部类被绑定到 外部对象

如果是这种情况,并且这确实是期望的行为,那么有没有一种方法可以在Scala中编码此需求

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

例如,您可以使用:


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

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

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

我认为从技术上讲,您不需要将
实例的类型更改为
外部#内部
,只需要在
foo
验证中。从
outerInstance.Inner
Outer#Inner
的转换总是安全和自动的。实际上,您参考的文档在最后有一个答案,将Scala与Java和
Graph进行了比较。Node
Graph#Node
相比,您可以通过将
pdp
定义为
对象pdp扩展外部
,在这种情况下,
新使用外部(pdp)
将推断单例类型,而不需要显式类型参数。
val user = new UseOuter[pdp.type](pdp)