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)