scala - 为什么我们可以在 Scala 中使用新类作为父类的类型?

标签 scala types locking actor f-bounded-polymorphism

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

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

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

最佳答案

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

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] 之下。

关于scala - 为什么我们可以在 Scala 中使用新类作为父类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56274171/

相关文章:

scala - 如何在运行时使用 quill 定义表名

C# 字典索引超出带锁的数组范围

防止除以 0 的 typescript 类型

java - 奇怪的乐观锁异常

multithreading - 如何有效地表示或建模锁定序列?

scala - 从列表中获取匹配谓词的子列表

scala - 为什么 Scala 集合中没有不可变的双链表?

scala - Spark - 将数据框分成 n 条记录

haskell - 如何在haskell中创建类的类型实例?

python - 如何将 numpy 数组从 'float64' 转换为 'float'