【问题标题】:Why can we use a new class as type of parent class in Scala?为什么我们可以在 Scala 中使用新类作为父类的类型?
【发布时间】:2019-10-09 23:11:20
【问题描述】:

在 RedBook 中 Actor 的简化实现中,他们使用基于节点的 MPSC 基于节点的 Actor 队列。他们通过这行代码定义节点:

private class Node[A](var a: A = null.asInstanceOf[A]) extends AtomicReference[Node[A]]

但是我们如何使用Node[A] 作为AtomicReference 的类型参数,因为我们还没有class Node[A]?它是在 Scala 中声明递归类型的一种方式吗?

【问题讨论】:

  • 它叫F-Bounded Polymorphism,你可以搜索更多关于该主题的内容。它在 OOP 语言中是一种比较常见的技术,例如 Java (Java 中的枚举使用它)。你可以使用它,因为类型已经定义,类没有,但类型是的。类型和类不一样。 - PS:在 Scala 中使用它并不常见,因为该语言缺乏对正确编码的适当支持,主要是因为 Typeclasses 是更好的选择。

标签: scala types locking actor f-bounded-polymorphism


【解决方案1】:

您可以在类/特征定义中使用递归:

abstract class Example[A] extends (A => Example[A])

def example(prefix: String): Example[String] = new Example[String] {
  def apply(s: String): Example[String] = {
    val t = prefix + s
    println(t)
    example(t)
  }
}

example("1")("2")("3") 
//12
//123

如果您有 X extends F[X],那么您最终会得到 C++ 开发人员所熟知的 curiously recurring template pattern,在类型理论中通常称为 F-bounded types

您甚至可以在 Java 中找到它,因为每个 enum X 都位于 abstract class X extends Enum[X] 之下。

【讨论】:

  • 所以这意味着Node[A] 将具有AtomicReference[AtomicReference[...Node[A]] 类型。
  • Node[A] 类型Node[A],它是AtomicReference[Node[A]]的子类型。 AtomicReference 本身不是递归的。
猜你喜欢
  • 2023-03-27
  • 2015-04-18
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2021-02-25
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多