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

标签 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 返回的引用,我想避免这种情况。没有 Actor 我得到:

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

最佳答案

这取决于你想要什么。在 A 中,B 表示 this.B,即从封闭实例创建的 B。的确,您的工厂会返回,但并没有这样说。它只是说它返回 A#B(称为 类型投影),一些未指定的 AB实例。如果对于你的 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/

相关文章:

scala - 使用 scala 插件在 IntelliJ IDEA 上导致实例崩溃

scala - 从 sbt 中的依赖项获取资源文件

scala - 如何向结构列添加新字段?

scala - SBT 任务将 package-src 创建的 jar 提取到某处

scala - 在抽象构造函数中访问覆盖的 val 时出现 NullPointerException

scala - 与take(10)和limit(10).collect()的性能比较

scala - 如何从序列创建受约束的 HList?

scala - Scala 3 中 "?=>"的含义是什么?

postgresql - 为什么编译失败并显示 "not found: value Users"?

scala - 为 fs2.Stream 的所有元素同时安排计算