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

时间:2019-05-23 11:25:44

标签: 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中声明递归类型的一种方法吗?

1 个答案:

答案 0 :(得分: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 ++开发人员所知的curiously recurring template pattern和类型理论中的普遍知识F-bounded types

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