举例说明:
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
返回的引用,我想避免这种情况。没有 Actor 我得到:
error: type mismatch;
found : A#B
required: A.this.B
最佳答案
这取决于你想要什么。在 A
中,B 表示 this.B
,即从封闭实例创建的 B
。的确,您的工厂会返回,但并没有这样说。它只是说它返回 A#B
(称为 类型投影),一些未指定的 A
的 B
实例。如果对于你的 val b,你不关心它是由哪个 A 实例创建的,那么你应该用 val b: A#B 这样说(或者让编译器推断它)。
如果您确实关心它是 A 中的 B 而不是其他,那么您可能就不走运了。您的 factory
返回由 a
参数创建的 B
实例。但是你的签名没有这么说。你会想要 a.B
而不是不太精确的类型投影 A#B
。 las,语言不允许这样做。你会得到一个错误illegal dependent method type:当你写一个依赖类型a.B
时,a
must be a "stable identifier"and a method参数不被认为是一个。也许this blog post可能有帮助
关于scala - 在 Scala 中,如何在包含类之外为嵌套类型构建工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7449686/