以下示例代码无法编译,并出现下面列出的错误。
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
中的pdp
与UseCase
中的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)
}