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

时间:2011-09-16 19:51:58

标签: 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
}

C.factory是用于创建A#B的新实例的函数。由于B是嵌套类型,因此我在函数签名中包含了A引用。调用函数f必须强制转换从factory返回的引用,我希望避免使用它。没有演员,我得到:

error: type mismatch;
found   : A#B
required: A.this.B

1 个答案:

答案 0 :(得分:7)

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

如果你确实关心它是你A的B而不是其他人,你可能会失去运气。您的factory会返回B参数创建的a实例。但你的签名并没有这么说。您需要a.B而不是不太精确的类型投影A#B。唉,语言不允许这样。您将收到错误非法依赖方法类型:当您编写从属类型a.B时,a必须是“稳定标识符”且方法参数不被视为一个。也许this blog post可能有帮助