为什么我们可以在 Scala 中使用新的 class 作为父 class 的类型?
Why can we use a new class as type of parent class in Scala?
在RedBook中Actor的简化实现中,他们对Actor使用了基于节点的MPSC节点队列。他们通过这行代码定义节点:
private class Node[A](var a: A = null.asInstanceOf[A]) extends AtomicReference[Node[A]]
但是我们还没有class Node[A]
,怎么能用Node[A]
作为AtomicReference
的类型参数呢?它是在 Scala 中声明递归类型的一种方式吗?
您可以在 class/trait 定义中使用递归:
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 and in type theory in general as F-bounded types 的东西。
你甚至可以在 Java 中找到它,因为每个 enum X
都在 abstract class X extends Enum[X]
.
下面
在RedBook中Actor的简化实现中,他们对Actor使用了基于节点的MPSC节点队列。他们通过这行代码定义节点:
private class Node[A](var a: A = null.asInstanceOf[A]) extends AtomicReference[Node[A]]
但是我们还没有class Node[A]
,怎么能用Node[A]
作为AtomicReference
的类型参数呢?它是在 Scala 中声明递归类型的一种方式吗?
您可以在 class/trait 定义中使用递归:
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 and in type theory in general as F-bounded types 的东西。
你甚至可以在 Java 中找到它,因为每个 enum X
都在 abstract class X extends Enum[X]
.