gpt4 book ai didi

scala - 路径依赖和内部类

转载 作者:行者123 更新时间:2023-12-02 03:23:30 26 4
gpt4 key购买 nike

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

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表明这是预期的行为?具体如下这句话:

As opposed to Java-like languages where such inner classes are members of the enclosing class, in Scala such inner classes are bound to the outer object.

如果情况确实如此,并且这确实是所需的行为,那么有没有办法在 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 相同,因此类型正确匹配。

关于scala - 路径依赖和内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54096344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com