在Scala中,如何在包含类之外的嵌套类型中构建工厂?

Lan*_*uhn 3 scala

用一个例子解释:

class A {
    def f = {
        val b: B = C.factory(this).asInstanceOf[B]
    }
    class B
}

object C {
    def factory(a: A): A#B = new a.B
}
Run Code Online (Sandbox Code Playgroud)

C.factory是一个用于创建新实例的函数A#B.既然B是嵌套类型,我A在函数签名中包含了一个引用.调用函数f必须转换从中返回的引用factory,我想避免使用它.没有演员,我得到:

error: type mismatch;
found   : A#B
required: A.this.B
Run Code Online (Sandbox Code Playgroud)

Did*_*ont 7

这取决于你想要什么.在A,B表示this.B,B是从封闭实例创建的.确实,你的工厂会回报这个问题,但事实并非如此.它只是说它返回A#B(称为类型投影),一个B未指定的A实例.如果,对于你的val b,你不关心它是由哪个实例创建的,那么你应该用val b来说:A#B(或者让编译器推断它).

如果你确实关心它是你A的B而不是其他人,那么你可能会失去运气.您factory将返回Ba参数创建的实例.但你的签名并没有这么说.你会想要a.B而不是不那么精确的类型投影A#B.唉,语言不允许这样.您将获得错误非法依赖方法类型:当您编写依赖类型时a.B,a必须是"稳定标识符"并且方法参数不被视为一个.也许这篇博文可能有所帮助

  • 您可以使用选项`-Ydependent-method-types`启用相关方法类型而不使用其他实验功能.此功能未得到官方支持,但可能会发生变化. (2认同)