用一个例子解释:
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
答案 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可能有帮助