2

在 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 中声明递归类型的一种方式吗?

4

1 回答 1

8

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

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++ 开发人员所熟知的奇怪的重复模板模式,并且在类型理论中通常为F-bounded types

你甚至可以在 Java 中找到它,因为每个enum X都在abstract class X extends Enum[X].

于 2019-05-23T12:09:03.587 回答